2012-07-12 102 views
0

我有openGL代碼,它呈現一些對象併爲其中的一些顯示文本標籤。通過使用gluProject將適當的頂點投影到屏幕上,然後添加一個小的偏移量,使標籤位於頂點旁邊來顯示標籤。這樣每個標籤與屏幕頂點的距離相同。如何在openGL顯示列表中投影/未投影

我最初並沒有使用顯示列表(除了字形的顯示列表),並且它正常工作(如果有點慢)。現在我爲整個場景創建一個顯示列表,並發現標籤放置不正確。

我花了一段時間,但我想我已經基本上找到了問題:gluProject將投影矩陣,模型視圖矩陣和視口作爲參數。除了調用glGetDoublev(GL_MODELVIEW_MATRIX,...)等,我沒有辦法提供它們。但是,glGet函數在顯示列表中是「不允許的」,這在經驗上似乎意味着它們不會導致錯誤,而是立即執行。因此,編譯到顯示列表中的矩陣數據是從列表編譯時間而不是列表執行時間(這是一個問題,因爲我需要預編譯列表,而不是立即執行)。至少這是我目前的理論。

  1. 任何人都可以確認或否認這會導致問題?
  2. 如何解決這個問題?我只想做gluProject的工作,但使用列表的當前矩陣。

注意:我知道在近期的openGL版本中已經棄用了各種函數/方法;請不要讓我的答案沿着「你不應該這樣做」;-)

回答

1

想一想:glGet…將一些數據放在進程內存中,可能在堆棧中。絕對沒有辦法,顯示列表甚至可以重現對數據執行的計算,這甚至不在其範圍內。除此之外,GLU(注意U)函數不是OpenGL的一部分,因此不要顯示在顯示列表中。 GLU函數也不是GPU加速的,所有的計算都發生在CPU上,並且由於API設計數據傳輸效率相當低。

像這些,你發現,使顯示列表不切實際的原因之一,爲什麼他們已被從後來的OpenGL版本剝離的原因之一。換句話說:不要使用它們。

改爲使用頂點緩衝區對象和索引緩衝區。像您這樣的標籤系統可以使用實例化來實現,並由目標位置列表提供。如果實例化不可用,則需要爲標籤的頂點屬性向量提供冗餘位置屬性。

無論如何:在你的情況下,正確使用着色器和VBOs將輕鬆勝過任何基於顯示列表的解決方案(因爲你無法顯示列出所有內容)。


相反奇怪,但工作將是調用glRasterPos,glBitmap(因此glutBitmap文本電話)放置在顯示列表,所述偏移在實際投影映射前的投影矩陣施加,即

glMatrixMode(GL_PROJECITON); 
glLoadIdentity(); 
scene_projection(); 

draw_scene(); 

glMatrixMode(GL_PROJECITON); 
glLoadIdentity(); 
glTranslatef(...); /* for the offset */ 
scene_projection(); 

draw_labels(); 

雖然這是我12年前完成的工作。絕對不是今天。

+0

當我在顯示列表中調用glRotate時,會執行矩陣乘法。所以顯示列表在執行時必須以某種方式訪問​​當前的投影/模型視圖矩陣(或否?)。那麼可以不用glProject做什麼(不一定直接調用它,而是應用相同的計算),與這些矩陣相乘?這就是我所說的「使用列表的當前矩陣」。或者我誤解了一些東西(這很可能)? – Dabbler 2012-07-12 17:32:19