Объявите внешние глобальные переменные для glsl validator / webgl / three.js - PullRequest
1 голос
/ 05 мая 2019

Я создаю проект с three.js и импортирую файлы glsl извне (с помощью glsl-ify-loader) для использования в Three ShaderMaterial.

При использовании ShaderMaterial, Three предварительно добавляет глобальные переменные, такие как projectionMatrix, modelViewMatrix, к моей предварительной компиляции кода шейдера, когда он объединяет шейдер. Поэтому, когда я пишу свой шейдер, все, что мне нужно, это (в качестве простого примера):

varying vec3 vNormal;

void main () {
  vNormal = normal;
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

... или аналогичный.

Моя проблема в том, что я использую валидатор glsl в моих файлах шейдеров, который впоследствии считает, что предварительно объявленные три переменные не объявлены.

В JS с eslint вы можете поставить /* global aGlobalVariableHere */, чтобы успокоить богов линта.

Есть ли способ сделать это с помощью валидатора glsl? Я не могу найти никаких ресурсов, которые бы подсказывали, как я могу это сделать.

1 Ответ

3 голосов
/ 06 мая 2019

Вы можете использовать THREE.RawShaderMaterial (см. Документы) вместо ShaderMaterial.Они идентичны, за исключением того, что Raw не добавляет к вашему шейдеру никакой униформы или атрибутов, вы должны сделать это вручную.Тогда ваш линтер больше не будет удивлен:

Вершина вершинного шейдера:

precision highp float;

uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
uniform vec3 cameraPosition;
// ...

attribute vec3 position;
attribute vec3 normal;
attribute vec2 uv;
// ...

Вы можете прочитать эту страницу , чтобы увидеть, какие формы и атрибуты добавляются автоматически, таквы можете добавить их самостоятельно, если это необходимо, в код вашего шейдера.

...