2010-01-17 73 views

回答

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);  

您可能还需要查找使用索引缓冲区上传指数(或其他绘图程序)。恐怕对于我的大脑来说,回想一下使用顶点和索引缓冲区的所有不同方式有点迟。

如果你只画一个点,那么我会添加大多数这是不必要的(你需要绘制10s或100s的数千个点,因为它会变慢),并且只会使代码变得更难阅读,理解和维护。

+0

鉴于这个问题是为了避免直接模式,VBO解决方案是正确的选择。一个GL_POINTS基元应该像其他任何一样渲染。 – gavinb 2010-01-17 02:09:13

+0

我认为一个(体面的)OpenGL驱动程序可能会将显示列表编译并上传到图形卡(/服务器),以便每次显示时不必传输显示列表,因此显示列表与“保留“模式作为缓冲对象。它也更加方便,这就是为什么我将它包含在答案中。哪个更好取决于我认为的应用程序。 – 2010-01-17 12:22:53

-3

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

我能想到这样做只是画了一系列的屏幕空间四边形或三角形的唯一的其他方式...

为什么你想以其他方式画一个点?即时模式有什么问题?

+0

我宁愿不先使用即时模式出于习惯,其次是因为该习惯的原因(即时模式较慢)。 但是,这仅仅是一个点吗? – 2010-01-17 00:51:29

+0

hrm ... glDraw *(GL_POINTS,...)呢?原始类型是所有绘制方法的参数。 – Bahbar 2010-01-17 09:05:47