【发布时间】:2013-01-24 13:52:36
【问题描述】:
我正在尝试使用 glVertexAttribPointer() 向我的顶点着色器提供一些数据。问题是它只适用于 FIRST 属性...
这是我的 OpenGL 代码:
struct Flag_vertex
{
GLfloat position_1[ 8 ];
GLfloat position_2[ 8 ];
};
Flag_vertex flag_vertex;
... // fill some data to flag_vertex
GLuint vertexbuffer_id;
glGenBuffers( 1, &vertexbuffer_id );
glBindBuffer( GL_ARRAY_BUFFER, vertexbuffer_id );
glBufferData( GL_ARRAY_BUFFER, sizeof(flag_vertex), &flag_vertex, GL_STATIC_DRAW );
glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );
glBindBuffer( GL_ARRAY_BUFFER, vertexbuffer_id );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_1) );
glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_2) );
我的着色器是这样的:
#version 420 core
layout(location = 0) in vec2 in_position_1;
layout(location = 1) in vec2 in_position_2;
out vec2 texcoord;
void main()
{
gl_Position = vec4(in_position_X, 0.0, 1.0);
texcoord = in_position_X * vec2(0.5) + vec2(0.5);
}
如果我使用“in_position_1”,我的纹理会完美渲染,但如果我使用 in_position_2,则不会发生任何事情......
提示:在链接我正在做的着色器之前:
glBindAttribLocation( programID, 0, "in_position_1");
glBindAttribLocation( programID, 1, "in_position_2");
为什么它只适用于第一个流?我需要更多数据到我的顶点...我需要发送颜色等...有什么提示吗?
【问题讨论】:
-
您是否启用了两个顶点属性?顺便说一句,如果您在着色器中使用布局限定符,则不需要使用
glBindAttribLocation。 -
哦,是的,当然……我忘了写……我在使用之前做了 glEnableVertexAttribArray( 0 ) 和 glEnableVertexAttribArray( 1 )……我会更新它。
-
如果你切换布局ID(即,in_position_1 -> 1,in_position_2 -> 0),会有不同的工作方式吗?
-
有点……如果我在着色器上打开它们,它就会停止工作。如果我在 OpenGL 代码上切换名称,in_position_2 开始工作,而 in_position_1 停止......就像它只识别第一个流:-(
-
顺便说一句,我尝试了没有“布局(位置= X)”的情况,结果相同。
标签: opengl glsl shader vertex-shader