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!

0 ответов

Другие вопросы по тегам