绑定非零纹理会使程序与VBO崩溃

时间:2014-08-10 13:24:36

标签: opengl textures shader vbo

所以我想实现一个简单的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);

我真的不知道为什么会发生这种情况。在没有着色器的情况下执行纹理会使其崩溃,绑定没有纹理的着色器会使其崩溃。有任何帮助或建议吗?

1 个答案:

答案 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/

中的教程