2012-07-20 72 views
1

当我将我的缓冲区绑定到我的着色器的属性时,它们似乎正在翻转。顶点属性缓冲区绑定到错误的属性

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

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

回答

0

所以,在MārtiņšMožeiko的帮助下,我弄清楚了这一点。我正确地在LinkProgram之前调用BindAttribLocation。但是,在我绑定任何属性位置之前,我并没有调用GL.CreateProgram()。

+0

您应该使用glGetError函数验证所有OpenGL调用。它会立即显示错误的函数调用。 – 2012-07-23 00:41:03

4

GL.BindAttribLocation必须GL.LinkProgram之前执行你的代码片段后调用GL.LinkProgram

编辑: 回答您的更新 - 因为你不使用in_color,所以OpenGL只是忽略这个输入。而你的顶点着色器只能以in_position作为输入。最有可能的是它在位置0绑定它。这就是为什么你的代码有效。您应该在链接程序之前绑定位置,如上面链接中所述。

+0

最初,我没有(我认为我正在使用的一个例子也有错误),但我修复了它,并且看到了同样的问题。 – jwrush 2012-07-20 08:42:31

+0

我搜索了BindAttribLocation,并在每个之前放置了一个调试输出,并搜索了LinkProgram并在其前面放置了一个调试输出。我得到: 绑定属性... 绑定属性... 正在链接... – jwrush 2012-07-22 17:02:55

+0

通过您的帮助指出我正确的方向。谢谢! – jwrush 2012-07-22 17:07:34