当我将我的缓冲区绑定到我的着色器的属性时,它们似乎正在翻转。顶点属性缓冲区绑定到错误的属性
所以,我已经有了一个顶点着色器:
precision highp float; uniform mat4 projection_matrix; uniform mat4 modelview_matrix; in vec3 in_position; in vec3 in_color; out vec3 ex_Color; void main(void) { gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1); ex_Color = in_color; }
和碎片着色器
precision highp float; in vec3 ex_Color; out vec4 out_frag_color; void main(void) { out_frag_color = vec4(ex_Color, 1.0); }
没有什么太复杂。有两个输入:一个用于顶点位置,另一个用于颜色。 (作为一个新手,我不想处理纹理或光线。)
现在,在我的客户端代码中,我将数据放入两个矢量数组positionVboData和colorVboData中,并创建了VBO .. 。
GL.GenBuffers(1, out positionVboHandle); GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); GL.BufferData<Vector3>(BufferTarget.ArrayBuffer, new IntPtr(positionVboData.Length * Vector3.SizeInBytes), positionVboData, BufferUsageHint.StaticDraw); GL.GenBuffers(1, out colorVboHandle); GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle); GL.BufferData<Vector3>(BufferTarget.ArrayBuffer, new IntPtr(colorVboData.Length * Vector3.SizeInBytes), colorVboData, BufferUsageHint.StaticDraw);
,然后,我会期望下面的代码工作绑定驻维也纳各组织的属性为着色器:
GL.EnableVertexAttribArray(0); GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); GL.BindAttribLocation(shaderProgramHandle, 0, "in_position"); GL.EnableVertexAttribArray(1); GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle); GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); GL.BindAttribLocation(shaderProgramHandle, 1, "in_color");
但是,事实上,我必须在最后一个代码示例中交换positionVboHandle和colorVboHandle,然后它完美地工作。但那似乎是倒退给我的。我错过了什么?
更新
奇怪的事情是怎么回事。如果我改变顶点着色器这样的:
precision highp float; uniform mat4 projection_matrix; uniform mat4 modelview_matrix; in vec3 in_position; in vec3 in_color; out vec3 ex_Color; void main(void) { gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1); //ex_Color = in_color; ex_Color = vec3(1.0, 1.0, 1.0); }"
并作出其他任何更改(不是修复其他建议所有的设置,它加载正确的属性,顶点后移动程序链接。位置,进入IN_POSITION而不是进入in_color
您应该使用glGetError函数验证所有OpenGL调用。它会立即显示错误的函数调用。 – 2012-07-23 00:41:03