所以我想实现一个简单的VBO,看看是否值得切换场景中静态对象的显示列表。到目前为止,我不认为我很快就会这样做。所以继承我的问题:我可以渲染顶点,但是一旦我投入纹理坐标,它就会崩溃。所以我做了一些实验,因为我将纹理绑定到了东西上。我从来没有听说过这是一个问题。字面上完全相同的代码,使用显示列表工作。这是我的代码:
//create a vertex buffer object for the particles to use
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//create the data, this is really sloppy
float QuadVertextData[] = {0,0,0,1,0,0,1,1,0,0,1,0};
float QuadTextureData[] = {0,1,1,1,1,0,0,0};
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*3, &QuadVertextData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//generate another buffer for the texcoords
glGenBuffers(1, &VBOT);
glBindBuffer(GL_ARRAY_BUFFER, VBOT);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*2, &QuadTextureData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
和渲染:
glUseProgram(shader);
glBindTexture(GL_TEXTURE_2D, texture);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, VBOT);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_QUADS, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
我真的不知道为什么会发生这种情况。在没有着色器的情况下执行纹理会使其崩溃,绑定没有纹理的着色器会使其崩溃。有任何帮助或建议吗?
答案 0 :(得分:-1)
在核心opengl配置文件中,您需要使用VAO才能使用glDrawArrays和glDrawElements等调用。 VAO(顶点数组对象)是VBO的绑定点列表,它封装了数据格式和绑定到它的每个VBO的组件数量等信息。在代码中它看起来像这样。
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*3, &QuadVertextData, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glGenBuffers(1, &vbot);
glBindBuffer(GL_ARRAY_BUFFER, vbot);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*2, &QuadTextureData, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glBindVertexArray(0);
0和1(glVertexAttribPointer的第一个参数)指定着色器中的通用顶点属性索引。 2和3(第二个参数)指定组件的数量。您的输入应该在着色器中像这样定义,以便使用此VAO:
layout(location=0) in vec3 position;
layout(location=1) in vec2 textureCoordinates;
在绘制任何内容之前,您只需使用着色器程序,绑定纹理并绑定VAO:
glUseProgram(shader);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glBindVertexArray(vao);
glDrawArrays(GL_QUADS, 0, 4);
不要忘记在着色器中设置sampler2D的纹理位置。
如果您想了解有关切换到OpenGL核心配置文件的更多信息,我建议您使用http://www.opengl-tutorial.org/
中的教程