OpenGL缓冲区问题

问题描述 投票:2回答:1

我在过渡到linux之后最近又回到了OpenGL。由于某种原因或其他原因,普通的GL标头中不存在glGenBuffers,glBindBuffer等东西,并导致我的程序使用GLEW崩溃。为了解决这个问题,我一直在使用GLES2。

现在是问题:

#include <SFML/Graphics.hpp>
#include <GLES2/gl2.h>
#include <GL/gl.h>

int main() {
    sf::RenderWindow window(sf::VideoMode(640, 480), "OpenGL Tests");

    glOrtho(0, 640, 0, 480, -1, 1);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    glClearColor(0, 0, 0, 0);

    //x, y, r, g, b
    GLfloat triangleVertices[15] = {
        10, 10, 1, 0, 0,
        110, 10, 0, 1, 0,
        60, 96.6f, 0, 0, 1
    };
    GLuint triangleBuf;

    glGenBuffers(1, &triangleBuf);
    glBindBuffer(GL_VERTEX_ARRAY, triangleBuf);
    glBufferData(GL_VERTEX_ARRAY, sizeof(triangleVertices), triangleVertices, GL_STATIC_DRAW);
    glBindBuffer(GL_VERTEX_ARRAY, 0);

    while(window.isOpen()) {
        sf::Event event;

        while(window.pollEvent(event)) {
            if(event.type == sf::Event::Closed) window.close();
        }

        glClear(GL_COLOR_BUFFER_BIT);

        glBindBuffer(GL_VERTEX_ARRAY, triangleBuf);
        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(2, GL_FLOAT, 3, 0);
        glEnableClientState(GL_COLOR_ARRAY);
        glColorPointer(3, GL_FLOAT, 2, (GLfloat*) 2);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        window.display();
        sf::sleep(sf::milliseconds(50));
    }

    glDeleteBuffers(1, &triangleBuf);
}

这就是我记得使用缓冲区的方式,但老实说,我不相信自己的记忆。似乎有充分的理由,因为这在窗口打开后立即崩溃。

我已经尝试将glDrawArrays的最后一个参数更改为1而不是3。我还尝试了两次绑定缓冲区,首先是GL_VERTEX_ARRAY,然后是glVertexPointer,第二是GL_COLOR_ARRAY,然后是glColorPointer。没有骰子。任何帮助表示赞赏。谢谢。

c++ opengl opengl-es buffer
1个回答
0
投票

glVertexPointerglVertexPointer的第三个参数是连续(跨步)之间的字节偏移。如果绑定了命名的缓冲区对象,则第4个参数也将视为字节偏移。

此外glColorPointer不是有效的缓冲区目标。它必须是glColorPointer

GL_VERTEX_ARRAY
GL_ARRAY_BUFFER
© www.soinside.com 2019 - 2024. All rights reserved.