由于 OpenGL 中不推荐使用通用顶点属性,因此我尝试仅使用自定义属性重写我的顶点着色器。而且我没有为我工作。这是顶点着色器:
attribute vec3 aPosition;
attribute vec3 aNormal;
varying vec4 vColor;
vec4 calculateLight(vec4 normal) {
// ...
}
void main(void) {
gl_Position = uProjectionMatrix * uWorldViewMatrix * vec4(aPosition, 1);
vec4 rotatedNormal = normalize(uWorldViewMatrix * vec4(aNormal, 0));
vColor = calculateLight(rotatedNormal);
}
这在 OpenGL ES 2.0 中完美运行。但是,当我尝试将它与 OpenGL 一起使用时,我看到了黑屏。如果我更改aNormal
为通用,gl_Normal
一切正常(请注意,aPosition
在两种情况下都可以正常工作,我不必使用gl_Vertex
)。
我究竟做错了什么?
我使用 RenderMonkey 来测试着色器,并在其中使用适当的属性名称(aPosition 和 aNormal)设置流映射。也许它与属性索引有关,因为我将它们全部设置为0
? 此外,这是 RenderMonkey 文档中关于在“流映射”中设置自定义属性名称的内容:
“属性名称”字段显示可在着色器编辑器中用于引用该流的默认名称。在 OpenGL ES 效果中,应使用更改后的名称来引用流;但是,在 DirectX 或 OpenGL 效果中,新名称对着色器编辑器没有影响
我想知道这个问题是否特定于 RenderMonkey 或 OpenGL 本身?为什么aPosition
仍然有效呢?