当我结合我的缓冲区为我着色器的属性,它们似乎越来越翻转。
所以,我有一个顶点着色器:
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的两个数组,我创建了维也纳组织...
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。