2009-09-16 25 views
1

我正在進行2D遊戲。想象一下一個XY平面,你是一個角色。隨着角色走動,場景的其他部分進入視野。OpenGL遊戲開發 - 跨越視野的場景

想象一下,XY平面非常大,並且當前視圖之外還有其他字符。

這是我的問題,用opengl,如果這些對象不是在當前視圖之外渲染的,他們會吃掉處理時間嗎?

此外,有什麼方法可以避免渲染場景中的部分不在視圖中。如果我有一個距離當前位置1000個單位的立方體,我不想渲染這個對象。我怎麼可能讓opengl沒有渲染。

我想最簡單的方法是計算位置,然後不繪製該立方體/對象,如果它太遙遠。

回答

3

如果您已經正確設置了場景圖,則應該儘早在顯示管道中選取視野外的對象。它需要在你的代碼中檢查盒子來驗證對象是不可見的,所以會有一些處理開銷(但不是很多)。

如果您將對象組織爲明智的層次結構,那麼您只需一次檢查就可以清除大部分場景。

7

OpenGL faq的「裁剪,剔除和可見性測試」這樣說:

的OpenGL提供了用於確定給定原始是否會在場景中可見對於給定的觀點沒有直接的支持。最糟糕的情況是,應用程序需要手動執行這些測試。上一個問題包含有關如何執行此操作的信息。

繼續閱讀該鏈接的其餘部分,它都是相關的。

0

通常,您的應用程序必須執行這些優化 - OpenGL實際上只是渲染部分,並且不執行對象管理或類似的任何操作。如果您傳遞數據以獲取不可見的東西,則必須先將相關座標轉換爲視圖空間,然後才能確定它完全在屏幕外或超出其中一個剪輯平面。

有幾種從管道中剔除不可見對象的方法。檢查相機後面是否有對象可能是最容易且最便宜的檢查,因爲通過每個對象的簡單計算,您可以平均拒絕一半的數據集。對實際視圖進行相同的測試並不難,因爲它拒絕一切看不見的東西。

很顯然,在一個複雜的遊戲中,你不會希望爲每一個小物體做這件事,所以通常將它們分組,不管是分層的(例如,如果你已經確定你不是渲染持有它的角色),空間上(例如,將世界劃分成網格/四叉樹/ octree並拒絕任何你知道在你已經確定的區域內的對象當前是不可見的)或更多通常是兩者的組合。

0

「的唯一獲獎的舉動是不是打」

每glVertex等將是一個性能無論它最終得到你的屏幕上呈現的打擊。解決這個問題的唯一方法是不要繪製(即剔除)無論如何都不會呈現的對象。

最常見的方法是將viewing frustum綁定到您的相機。再加上octtreequadtree,這取決於你的遊戲是3d/2d,所以你不需要檢查每一個遊戲對象的錐體。

0

底層驅動程序可能在幕後做了一些剔除,但是你不能依賴它,因爲它不是OpenGL標準的一部分。也許你的電腦的驅動程序這樣做,但也許別人的(誰可能運行你的遊戲)不會。你最好自己去挑選。