GLSL - 检查设置的属性

5

我有一个顶点着色器,其中的属性在任何给定帧中可能被设置或未设置。如何检查这些属性是否已设置?

我想要做的事情:

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
我们在谈论GL ES 2,我猜是吗? - Kos
1个回答

11
我有一个顶点着色器,其中的属性在任何给定帧中可能被设置或未设置。
不,你没有。:)
对于属性而言,不可能出现属性未被 "设置" 的情况。每个顶点着色器实例都从每个声明的属性接收有效值。
如果属性数组未通过 glEnableVertexArray 启用,则将传递默认属性(由 glVertexAttrib 及其默认值指定)。
在您的情况下,您可以选择:
  • 编译具有或不具有纹理的不同版本的着色器(条件编译是您的朋友;搜索 UberShader),
  • 使用像 "useTexturing" 这样的统一变量来节省着色器切换。
选择一个。

顺便说一下,我之前所说的有一个例外——如果属性在着色器代码中没有被使用,编译器/链接器很可能会将其优化掉(即从着色器代码中删除并以-1作为getVertexAttribLocation的响应)。但这不是这种情况。 - Kos
@Kos 很高兴知道OpenGL在这一点上可以自己管理。你知道如果没有其他定义时会使用哪些默认值吗? - Florian R. Klein
我期望得到0或未定义,但我无法想象。最好只设置一次。 - Kos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接