使用 OpenGL 绘制一个点,但不是在立即模式下

ada*_*m_0 3 opengl user-interface

所以我想在 OpenGL 中绘制一个 2D 点,但不是在立即模式下。我已经有一段时间没有在 OpenGL 中编程了,所以我有点生疏了,我在红皮书中找不到它。

感谢所有帮助。

谢谢!

Ada*_*wen 5

如果“非即时模式”是指将几何图形上传到图形卡并调用渲染它,那么有几种方法可以做到这一点。最简单的就是用一个显示列表预编译一个OpenGL命令列表来执行

Gluint list = glGenLists(1);
// Release with glDeleteLists(list,1);
glNewList(list,GL_COMPILE);

// Drawing code here

glEndList();
Run Code Online (Sandbox Code Playgroud)

然后渲染它

glCallList(list);
Run Code Online (Sandbox Code Playgroud)

一种可能更灵活和更快的方法是使用顶点缓冲区对象扩展(要轻松访问扩展,请查找 GLEW 库)。您可以将几何图形预加载到 VBO 中,然后通过调用 OpenGL 进行渲染:

float data[2] = {...};

GLuint buffer;
glGenBuffersARB(1,&buffer);
// Release with glDeleteBuffersARB(1,&buffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(data), data, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
Run Code Online (Sandbox Code Playgroud)

然后用类似的东西画画

GLuint indices[] = {0};

glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer);
glVertexPointer(3, GL_FLOAT, sizeof(float)*2, ((GLubyte*)NULL)+0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawElements(GL_POINTS,sizeof(indices)/(sizeof(indices[0])),GL_UNSIGNED_INT,indices);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);    
Run Code Online (Sandbox Code Playgroud)

您可能还想查找使用索引缓冲区来上传索引(或替代绘图例程)。恐怕我的大脑回想起使用顶点和索引缓冲区的所有不同方式有点晚了。

我想补充一点,如果你只是画一个点,那么大部分都是不必要的(你需要画 10 或 100 万点才能让它变慢),只会使代码更难阅读、理解和维护。