0

我能够渲染一个带有顶点的 VBO,但是当我尝试添加颜色(使用着色器属性)时,什么也没有出现。我在这里做错了什么?我可以找到很多在线示例显示这适用于交错的 VBO,但我宁愿使用这种方法(序列化数组)。有任何想法吗?

缓冲区生成和分配

glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );

glGenBuffers( 1, &vbo );
glBindBuffer( GL_ARRAY_BUFFER, vbo );

glBufferData( GL_ARRAY_BUFFER, ( vertices.size() + colors.size() ) * sizeof(float), NULL, GL_STATIC_DRAW );
glBufferSubData( GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(vertices[0]), vertices.data() );
glBufferSubData( GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), colors.size() * sizeof(colors[0]), colors.data() );

/* HERE if I replace the lower block with this top portion, things show up fine
glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_FLOAT, 0, (void*)0);
*/
glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, (void*)(vertices.size() * sizeof(GLfloat)) );

glGenBuffers( 1, &ibo );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, faces.size() * sizeof(GLushort), faces.data(), GL_STATIC_DRAW );

在这里画画

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClearDepth( 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glUseProgram( gl );
glBindVertexArray( vao );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo );
glDrawElements( GL_TRIANGLE_FAN, faces.size(), GL_UNSIGNED_SHORT, (void*)0 );

glutSwapBuffers();
glutPostRedisplay();

垂直着色器

#version 130
layout (location = 0 ) in vec3 in_Position;
layout (location = 1 ) in vec3 in_Color;
out vec3 out_Color;
void main()
{
    out_Color = in_Color;
    gl_Position = vec4(in_Position,1.0);
}

碎片着色器

#version 130
in vec3 out_Color;
void main() {
    gl_FragColor = vec4(out_Color, 1.0);
}
4

1 回答 1

1

您正在使用 GLSL 1.30 (OpenGL 3.0) 的版本标签,它不支持显式属性位置,您也没有显式启用相应的扩展。所以也许你的着色器甚至没有编译(或者它编译但location语法被忽略了)。这可以解释它与 good old 一起工作glVertexPointer,因为如果着色器没有编译,它只会使用固定功能管道。

所以首先检查是否有任何结果,glGetError以及你的着色器是否成功编译和链接(如果没有,他们的信息日志说什么)。但既然你有 OpenGL 3.0,很可能你有 OpenGL 3.3,所以只需将版本标记更改为#version 330,它支持显式属性位置。

于 2013-07-08T08:20:54.743 回答