顶点属性缓冲区得到势必错误属性(Vertex Attribute Buffers getting b

2019-09-27 17:36发布

当我结合我的缓冲区为我着色器的属性,它们似乎越来越翻转。

所以,我有一个顶点着色器:

 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。

Answer 1:

GL.BindAttribLocation必须GL.LinkProgram之前进行。 你打电话GL.LinkProgram这段代码后?

编辑:在回答你的更新 - 因为你不使用in_color,然后OpenGL的简单地忽略此输入。 和你的顶点着色器TAKS只IN_POSITION作为输入。 最有可能结合它的位置为0。这就是为什么你的代码工作。 因为它是在链接上述连接程序之前,您应该绑定位置。



Answer 2:

所以,用马丁斯Možeiko的帮助下,我能想出解决办法。 我LinkProgram之前正确调用BindAttribLocation。 但是,我没有打电话GL.CreateProgram()之前,我是有约束力的任何属性位置。



文章来源: Vertex Attribute Buffers getting bound to wrong attribute