我在让我的顶点着色器在 ATI 驱动程序上的 OpenGL 3.3 核心下运行时遇到了极大的麻烦:
#version 150
uniform mat4 graph_matrix, view_matrix, proj_matrix;
uniform bool align_origin;
attribute vec2 graph_position;
attribute vec2 screen_position;
attribute vec2 texcoord0;
attribute vec4 color;
varying vec2 texcoord0_px;
varying vec4 color_px;
void main() {
// Pick the position or the annotation position
vec2 pos = graph_position;
// Transform the coordinates
pos = vec2(graph_matrix * vec4(pos, 0.0, 1.0));
if( align_origin )
pos = floor(pos + vec2(0.5, 0.5)) + vec2(0.5, 0.5);
gl_Position = proj_matrix * view_matrix * vec4(pos + screen_position, 0.0, 1.0);
texcoord0_px = texcoord0;
color_px = color;
}
我使用 glVertexAttrib4f 来指定颜色属性,并关闭属性数组。根据 3.3 核心规范的第 33 页,应该可以:
如果与顶点着色器所需的通用属性对应的数组未启用,则从当前通用属性状态中获取相应的元素(参见第 2.7 节)。
但是(大多数情况下,取决于配置文件和驱动程序)如果我访问禁用的颜色属性,着色器要么根本没有运行,要么使用黑色。用常量替换它可以运行。
大量搜索产生了这个关于 WebGL 的提示页面,其中有以下内容:
始终启用顶点属性 0 数组。如果您在禁用顶点属性 0 数组的情况下进行绘制,则在桌面 OpenGL(例如 Mac OSX)上运行时,您将强制浏览器进行复杂的模拟。这是因为在桌面 OpenGL 中,如果顶点属性 0 未启用数组,则不会绘制任何内容。您可以使用 bindAttribLocation() 强制顶点属性使用位置 0,并使用 enableVertexAttribArray() 使其启用数组。
果然,不仅颜色属性被分配给索引零,而且如果我将一个不同的、启用数组的属性强制绑定为零,代码就会运行并产生正确的颜色。
我在任何地方都找不到任何其他提及此规则的内容,当然也不是在 ATI 硬件上。有谁知道这条规则来自哪里?或者这是 Mozilla 人员注意到并警告的实现中的错误?