Scenekit SCNShadable доступ к _surface.diffuseTexcoord рисует объект белым
Я испытываю странное поведение при попытке расширить материал PBR из комплекта сцены. Все, что я хочу сделать, это прочитать текстуру, отобразить ее с помощью первого ультрафиолетового канала (как обычно). Как только я упоминаю _surface.diffuseTexcoord
, _surface.diffuse
кажется, превращается в белый. Это не кажется постоянным (_output.rgb = vec3(1.)
) а точнее цвет белый пропускается через осветительный конвейер.
let myShader = "#pragma arguments\n" +
"sampler uMaskTex;\n" +
"uniform sampler2D uMaskTex;\n" +
"#pragma body\n" +
//"vec2 myDuv = _surface.diffuseTexcoord;\n" //paints the object white
OR
//"vec3 mask = texture2D( uMaskTex, _surface.diffuseTexcoord ).xyz;\n" //paints the object white
OR
"vec3 mask = texture2D( uMaskTex, vec2(1.) ).xyz;\n" //does not paint the object white
Я вообще не понимаю, почему эти каналы привязаны к "окружающим", "рассеянным", "зеркальным" и т. Д., Если они существуют в вершинном шейдере в _geometry.texcoords[MY_CHANNEL]
,
Моя попытка перевода _geometry.texcoords[0]
через varying vec2 v_my_abstract_uv_channel_not_diffuse_necesserily
закончилась неудачей.
редактировать
После некоторой магии вуду мне удалось заставить эту вещь работать так, как я хочу, но все еще не знаю, что вызывает такое поведение.
Обратите внимание, у меня нет текстуры в диффузном слоте для материала, он установлен на постоянный цвет. Думал, что что-то может быть заполнено мусором, но, как ни странно, _surface.diffuseTexcoord
действительно содержит значения, и они верны. Просто любое упоминание об этом заставляет все побелеть. Однако я использую обычную текстуру, назначенную через графический интерфейс.
Я догадался, что есть соответствующий _surface.normalTexcoord
даже если это не задокументировано, и это, кажется, сработало. Несмотря на то, что он содержит те же значения, материал не становится белым.
"#pragma arguments\n" +
"sampler uMaskTex;\n" +
"uniform sampler2D uMaskTex;\n" +
//"varying vec2 vTexCoord0;\n" + //varyings don't work :( ,
"#pragma body\n" +
"vec3 mask = texture2D(uMaskTex,_surface.diffuseTexcoord).xyz;\n" + //does not work, even though i don't do anything with this variable, it affects _surface.diffuse
"_output.color.rgb = vec3(_surface.diffuseTexcoord,1.);\n" + //actually contains values, not garbage as i thought
"_output.color.rgb = _surface.diffuse.rgb;\n"; //does not work, this outputs white, even though a different color is set
"_output.color.rgb = mask;\n"; //i do however get the texture to map correctly, i do see the texture with _surface.diffuseTexcoord lookup... ?!
С другой стороны:
"#pragma body\n" +
"vec3 mask = texture2D(uMaskTex,_surface.normalTexcoord).xyz;\n" + //works!
//works! even though there is no mention of this in the documentation.
//Gives exactly the same values as _surface.diffuseTexcoord
"_output.color.rgb = vec3( _surface.normalTexcoord , 1.);\n" +
"_output.color.rgb = _surface.diffuse.rgb;\n"; //works! no gremlins, doesn't turn to white, shows the color from gui!