我能够使用顶点渲染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();
vert shader
#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);
}
frag shader
#version 130
in vec3 out_Color;
void main() {
gl_FragColor = vec4(out_Color, 1.0);
}
答案 0 :(得分:1)
您正在使用GLSL 1.30(OpenGL 3.0)的版本标记,它不支持显式的attrib位置,也没有显式启用相应的扩展名。所以也许你的着色器甚至不编译(或者它确实如此,但location
语法被忽略了)。这可以解释它使用好的旧glVertexPointer
,因为如果着色器不编译,它将只使用固定功能管道。
首先检查glGetError
是否有任何结果,以及您的着色器是否成功编译和链接(如果没有,那么他们的信息日志会说明什么)。但是由于你有OpenGL 3.0,你可能还是有OpenGL 3.3,所以只需将版本标签改为#version 330
,它支持显式的attrib位置。