Opengl glVertexAttributePointer()仅处理第一个流

Opengl glVertexAttributePointer()仅处理第一个流,opengl,glsl,shader,vertex-shader,Opengl,Glsl,Shader,Vertex Shader,我正在尝试使用glVertexAttributePointer()为顶点着色器提供一些数据。问题是它只对第一个属性起作用 以下是我的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;

我正在尝试使用glVertexAttributePointer()为顶点着色器提供一些数据。问题是它只对第一个属性起作用

以下是我的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");
为什么它只适用于第一个流?我需要更多的数据到我的顶点。。。我需要发送颜色等。。。有什么提示吗

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\u顶点
。如果
Flag\u vertex
实际上应该是一个顶点(而不是四元体),那么它有8个浮点数是没有意义的。如果每个
标志\u顶点定义了一个完整的四边形,那么您将其命名错误;它根本不是顶点,它是
Flag\u quad

所以很难知道你在这里想要完成什么

此外:

如果我使用“in_position_1”,我的纹理渲染得很完美,但是如果我使用in_position_2,什么都不会发生

当然有。您的位置数据位于属性0中。因此,您的位置数据不在属性1中。如果你假装属性1有你的位置数据,而它显然没有,你将不会得到合理的结果

您的问题是,当您应该同时使用属性0和属性0时,您总是使用属性0。你不应该随便挑一个。使用
在位置_1
作为位置,使用
在位置_2
作为纹理坐标。根据他们的行为(比如
position
texture\u-coord
或其他)合理地命名他们。不要对它们使用数字

提示:在链接我的着色器之前,我正在执行以下操作:

glBindAttribLocation( programID, 0, "in_position_1");
glBindAttribLocation( programID, 1, "in_position_2");

这与着色器中的
布局(位置=#)
设置完全相同。如果要将其置于着色器中,请将其置于着色器中。如果你想把它放在你的OpenGL代码中,那么就把它放在你的OpenGL代码中。不要把它放在两个地方。

两个顶点属性都启用了吗?顺便说一句,如果在着色器中使用布局限定符,则不需要使用
glBindAttribLocation
。哦,是的,当然。。。我忘了写。。。在使用之前,我会先执行GlenableVertexAttributeArray(0)和GlenableVertexAttributeArray(1)。。。我会更新它。如果你切换布局ID(即,在位置1->1,在位置2->0),事情会不同吗?有点。。。如果我打开着色器,它将停止工作。如果我在OpenGL代码上切换名称,in_position_2开始工作,in_position_1停止。。。就像它只识别第一个流一样:-(顺便说一句,我尝试了一个没有“layout(location=X)”的流事实上,OP中的
glvertexattributepointer
调用非常好;它们只是在VBO中按顺序放置两个属性数据流。这是VBOs中使用数据的一种非常常见的方式。问题的解决方法在OP代码的另一个位置,与OP无关。请参阅以上是分辨率。@radical7:“它们只是在VBO中按顺序放置两个属性数据流”,但“属性数据”不是“顶点”。这是我的观点:如果它是一个结构中的两个非交错数组,那么该结构的名称不正确。抱歉,但我无法理解你的观点。如果你对海报选择的变量名称发表评论,这与解决方案无关。帖子中的代码正确且一致事实上,OP中的所有代码都是正确的——问题出在OP应用程序的其他地方。是的,问题出在其他地方……上面的代码非常完美。感谢大家的贡献。