OpenGL无法将属性数据发送到着色器

时间:2013-07-08 02:11:32

标签: opengl glsl

我能够使用顶点渲染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);
}

1 个答案:

答案 0 :(得分:1)

您正在使用GLSL 1.30(OpenGL 3.0)的版本标记,它不支持显式的attrib位置,也没有显式启用相应的扩展名。所以也许你的着色器甚至不编译(或者它确实如此,但location语法被忽略了)。这可以解释它使用好的旧glVertexPointer,因为如果着色器不编译,它将只使用固定功能管道。

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