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

时间:2010-01-17 00:47:09

标签: user-interface opengl

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

感谢所有帮助。

谢谢!

2 个答案:

答案 0 :(得分:4)

如果通过“不处于即时模式”意味着将几何图形上传到图形卡并进行调用以进行渲染,则有几种方法可以执行此操作。最简单的方法是使用显示列表预编译要执行的OpenGL命令列表

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

// Drawing code here

glEndList();

然后用

渲染它
glCallList(list);

一种可能更灵活,更快捷的方法是使用顶点缓冲区对象扩展(以便访问扩展,轻松查找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);
然后用

之类的东西画画
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);    

您可能还希望使用索引缓冲区来上传索引(或替代绘图例程)。我担心我的大脑要回忆起使用顶点和索引缓冲区的所有不同方法有点晚了。

如果您只是绘制一个点,我会添加,然后大部分内容都是不必要的(您需要绘制10个或100个数千个点才能使它变慢)并且只会使代码更难以阅读,理解和维护。

答案 1 :(得分:-3)

我不确定你能做到这一点......据我所知,绘制点的唯一方法是指定glBegin(GL_POINTS);

我能想到的另一种方法就是在屏幕空间中绘制一系列四边形或三角形......

为什么你要画一点呢?立即模式有什么问题?