我已經使用OpenGL和C++進行了各種演示項目,但他們都涉及簡單地渲染一個有一些有趣效果的單個立方體(或類似的簡單網格)。對於這樣的簡單場景,立方體的頂點數據可以存儲在不雅觀的全局數組中。我現在正在研究渲染更復雜的場景,以及不同類型的多個對象。OpenGL和OOP程序結構
我覺得很有道理,爲不同類型的對象(Rock
,Tree
,Character
等)的不同的類,但我不知道如何幹淨地打破了數據和場景中的對象渲染功能。每個類將存儲它自己的頂點位置,紋理座標,法線等數組。然而,我不確定在哪裏放置OpenGL調用。我想我會有一個循環(在World
或Scene
類中)遍歷場景中的所有對象並呈現它們。
應該渲染它們涉及調用每個對象中的渲染方法(Rock::render(), Tree::render(),...)
或將對象作爲參數的單個渲染方法(render(Rock), render(Tree),...)
?後者看起來更清晰,因爲我不會在每個類中都有重複的代碼(儘管可以通過繼承一個RenderableObject
類來緩解這個問題),並且如果我想稍後將端口轉換爲的DirectX。另一方面,我不確定是否可以將它們分開,因爲無論如何,我可能都需要存儲在對象中的OpenGL特定類型(例如,頂點緩衝區)。另外,將渲染功能與對象分開似乎有點麻煩,因爲它必須調用大量的Get()
方法才能從對象中獲取數據。最後,我不確定這個系統如何處理必須以不同方式繪製的對象(不同的着色器,不同的變量傳遞給着色器等)。
這些設計之一明顯比其他設計更好嗎?我可以通過哪些方式改進他們,以使我的代碼組織良好並且高效?
謝謝,這給了我幾個想法。我不太瞭解的一件事是可提供的類和你提到的網格類之間的區別。我不希望網格類是可以繪製自己的可渲染的嗎?在更高層次上,我認爲設計將比我預期的更復雜。你知道任何提供設計渲染系統的好介紹的在線資源嗎?我找到的大多數OpenGL教程都介紹了繪製,紋理和點亮幾個三角形的過程,而沒有對大圖片架構進行太多討論。 – Jeff 2012-03-26 20:00:56
@Jeff:沒有。網格只是頂點數據的集合。單獨的網格*是不夠的。爲了渲染某些東西,你需要一個網格,你想要渲染的着色器,以及其他各種狀態(紋理等)。 – 2012-03-27 00:37:52
@Jeff尼科爾說的是正確的。並非所有繪製的東西都是網格物體(例如,您可能還想繪製線條或其他像四邊形網格物體可能會過度殺傷的其他原始物體)。一個網格類應該描述幾何體(有時候每三層都有材料索引,分組/層次結構),但是沒有其他的東西。看看有關遊戲引擎開發的書籍(即使你沒有製作遊戲)。一個好的是「遊戲引擎架構」,也是「遊戲編程寶石」和「遊戲引擎寶石」有很多很好的信息。您可能還想潛伏gamedev.net論壇 – 2012-03-27 01:26:04