2010-01-17 74 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