Почему я получаю «необъявленный идентификатор», когда я объявил идентификатор в функции shader.replace?

#three.js #shader

#three.js #шейдер

Вопрос:

Контекст моего запроса — это тот, в котором я только что загрузил модель GLTF и делаю некоторые шейдерные модификации материала с помощью shader.onBeforeCompile. Я успешно выполнил этот же процесс раньше и озадачен тем, почему я получаю ошибку «необъявленный идентификатор».

Ошибка: ошибка

Соответствующий код:

 material.onBeforeCompile = shader => {

shader.vertexShader = shader.vertexShader.replace(
    '#define STANDARD',
    `#define STANDARD
    out float styleValue;`
).replace(
    '#include <common>',
    `#include <common>
    in float style;`
).replace(
    '#include <project_vertex>',
    `#include <project_vertex>
     styleValue=style;`
);


shader.fragmentShader = shader.fragmentShader.replace(
        '#define STANDARD',
        `#define STANDARD
    in float styleValue;`
    )
    .replace(
        '#include <fog_fragment>',
        `#include <fog_fragment>
    int style = int(styleValue); 
    vec4 col;
    if (style == 0) {
      col = texture2D(map, vUv );
    } else if ( style==1) {
      col = texture2D(map, vUv   vec2(.5,0.) );
    } 
       gl_FragColor = col;` );

};

  

Комментарии:

1. Какой тип материала вы пытаетесь изменить?

2. Это материал PBR. В итоге это стало проблемой, поскольку СТАНДАРТ #define не присутствовал в шейдерах для замены. Спасибо.

Ответ №1:

При регистрации вершинных и фрагментных шейдеров во время onBeforeCompile я заметил, что #define STANDARD отсутствует. Я изменил соответствующую строку replace, и теперь она работает.