最近我在从Windows转移到Linux后重新开始学习OpenGL。但不知何故,glGenBuffers
,glBindBuffer
等函数不在普通的GL头文件中,并且使用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
的最后一个参数从3改为1。我还尝试过两次绑定缓冲区,第一次作为GL_VERTEX_ARRAY
,然后是glVertexPointer
,第二次作为GL_COLOR_ARRAY
,然后是glColorPointer
。但都没用。
glBindBuffer
不能与GL_VERTEX_ARRAY
一起使用。可以参考这里。您是否意味着GL_ARRAY_BUFFER
? - Lukas-T