0

我正在尝试使用 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");

为什么它只适用于第一个流?我需要更多数据到我的顶点...我需要发送颜色等...任何提示?

4

1 回答 1

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”我的纹理渲染完美,但如果我使用 in_position_2 什么都不会发生......

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

您的问题是,当您应该同时使用它们时,您总是使用属性 0。你不应该选择其中一个。用于in_position_1位置和in_position_2纹理坐标。并尝试根据他们的所作所为(喜欢positiontexture_coord或某事)合理地命名他们。不要为他们使用数字。

提示:在链接我正在做的着色器之前:

layout(location=#)这与着色器中的设置完全相同。如果你想要它在着色器中,那么把它放在着色器中。如果你想在你的 OpenGL 代码中使用它,那么把它放在你的 OpenGL 代码中。不要放在两个地方。

于 2013-01-24T19:58:45.790 回答