2010-10-09 168 views
0

這是一個很好的初學者問題,但考慮到我在OpenGL中渲染了一個複雜的形狀,需要大量的計算,是否有將它導出爲像可以再次打開的模型那樣的狀態後來給你不會再編輯它?OpenGL保存渲染供以後使用

由於在程序啓動時計算形狀,我無法在程序之外創建它們(類似於Blender)。渲染然後被翻譯,旋轉,繪製等。注意,我不需要編輯形狀,但我確實希望它在3D狀態,因此保存圖像不是一種選擇。

我使用OpenTK 1.0,VB.NET(.NET 4)

回答

3

最明顯的可能是,你的頂點寫入一個文件,然後在需要時重新加載它們。除非您有其他特定的理由,否則最好使用現有文件格式之一,例如Wavefront OBJ,Ogre3d mesh XML文件,etc

+0

啊,那永遠打不過我。感謝您的格式! – Jay 2010-10-09 22:46:17

0

這聽起來像是OpenGL顯示列表的理想情況。您使用它們的方法是先問的OpenGL的顯示列表ID的使用方法:

GLuint draw_id = glGenLists(1); 

(你可以同時要求幾個連續的ID,但在這種情況下,我們只要求1) 然後通過您的抽獎程序第一次,調用glNewList後:

glNewList(draw_id, GL_COMPILE); 
<do compute intensive drawing here> 
glEndList(); 

注意,這實際上不會使您的外形(你可以在glNewList後,這渲染你的形狀使用GL_COMPILE_AND_EXECUTE,但一般不提倡)

現在,每當你需要繪製對象:

< set up your OpenGL matrices > 
glCallList(draw_id); 

最後,當你用它做,你可以使用glDeleteLists。

顯示列表實際上可以加速渲染,因爲可以完成一些優化,並且刪除所有函數調用開銷。

現在,從技術上講,OpenGL 3.0及更高版本(與glTranslate,glVertex glBegin ... grrr一起)不推薦使用OpenGL顯示列表(不會刪除!),但它們仍應在可預見的將來使用。爲了將來的證明,你應該使用頂點數組,但這是一個更復雜一點。

+0

爲什麼他們一直在貶低一切?我會嘗試你的方法,看看它的去向,但出於好奇,在OGL3中顯示列表的替代選擇是什麼? – Jay 2010-10-09 22:45:54

+2

嗯,從我所知道的,在OpenGL3.0及以上版本中,所有頂點數據應該放置在頂點緩衝區對象中,並且像素緩衝區對象中的紋理數據。所有轉換(如glRotate)都將被頂點着色器程序所取代。理由似乎是,所有高性能的OpenGL程序都已經完成了(大部分),但我認爲這嚴重提高了初學者或者編寫簡單圖形應用程序的標準。作爲一個可視化實驗室的圖形編程人員,我暫時沒有放棄OpenGL 2.1的計劃,儘管有些時候我可能會被迫去做。 – Gretchen 2010-10-10 19:30:58