#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, и теперь она работает.