我正在尝试使用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”我的纹理RENDERS完美,但如果我使用in_position_2没有任何反应...
提示:在链接我的着色器之前我正在做:
glBindAttribLocation( programID, 0, "in_position_1");
glBindAttribLocation( programID, 1, "in_position_2");
为什么它仅适用于第一个流?我需要更多的数据到我的顶点...我需要发送颜色等...任何提示?
答案 0 :(得分:0)
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) );
这些线条没有意义。至少,不是如何定义Flag_vertex
。如果Flag_vertex
确实应该是顶点(而不是四边形),那么它有8个浮点数是没有意义的。如果每个Flag_vertex
定义一个完整的四元组,那么你将它命名为错误;它根本不是顶点,它是Flag_quad
。
所以很难知道你甚至想要在这里完成什么。
此外:
如果我使用“in_position_1”我的纹理RENDERS完美,但如果我使用in_position_2没有任何反应...
当然可以。您的位置数据在属性0中。因此,您的位置数据在属性1中不。如果您假设属性1具有您的位置数据,则显然没有,您将无法获得合理的结果。
您的问题是,当您应该使用两者时,您总是使用属性0. 您不应该选择其中一个。使用in_position_1
作为位置,使用in_position_2
作为纹理坐标。并尝试根据他们的行为(如position
和texture_coord
或其他内容)合理命名。不要为他们使用数字。
提示:在链接我的着色器之前我正在做:
这与着色器中的layout(location=#)
设置完全相同。如果你想在着色器中使用它,那么将它放在着色器中。如果您想在OpenGL代码中使用它,那么将它放在您的OpenGL代码中。不要把它放在两个地方。