GLSL - Проверка установленных атрибутов - PullRequest
4 голосов
/ 12 декабря 2010

У меня есть вершинный шейдер с атрибутами, которые могут или не могут быть установлены в любом данном кадре.Как я могу проверить, были ли установлены эти атрибуты или нет?

Что я хотел бы сделать:

attribute vec3 position;
attribute vec3 normal;
attribute vec4 color;
attribute vec2 textureCoord;


uniform mat4 perspective;
uniform mat4 modelview;
uniform mat4 camera;
uniform sampler2D textureSampler;

varying lowp vec4 vColor;

void main() {
    gl_Position = perspective * camera * modelview * vec4(position, 1.0);
 if ((bool)textureCoord) { // syntax error
     vColor = texture2D(textureSampler, textureCoord);
 } else {
     vColor = (bool)color ? color : vec4((normal.xyz + 1.0)/2.0 , 1.0); 
 }
}

1 Ответ

9 голосов
/ 12 декабря 2010

У меня есть вершинный шейдер с атрибутами, которые могут или не могут быть установлены в любом данном кадре.

Нет, нет.:)

С атрибутами невозможно, чтобы атрибут не был «установлен».Каждый экземпляр вершинного шейдера получает действительные значения от каждого объявленного атрибута.

Если массив атрибутов не включен glEnableVertexArray, то будет передан атрибут по умолчанию (как указано glVertexAttrib и его значения по умолчанию).


В вашем случае вы можете:

  • скомпилировать свой шейдер в разных версиях с или без текстурирования (условная компиляция - ваш друг; Google для UberShader),
  • используйте унифицированную переменную, например "useTexturing", для сохранения на переключателях шейдеров.

Выберите одну.

...