我正在建設一個微縮城市,以便可以在其中移動的城市(道路,建築物,樹木等)的基本最小外觀。我知道在每一幀中渲染整個模型是行不通的...OpenGL - 選擇性世界渲染
那麼,任何人都可以給我一個關於標準(但最簡單)的程序的見解,用於有選擇地渲染系統的可見部分嗎?我的意思是,只顯示可見的東西(相對於相機的位置),而不是渲染看不見的部分。 我使用VC++和GLUT API。
我正在建設一個微縮城市,以便可以在其中移動的城市(道路,建築物,樹木等)的基本最小外觀。我知道在每一幀中渲染整個模型是行不通的...OpenGL - 選擇性世界渲染
那麼,任何人都可以給我一個關於標準(但最簡單)的程序的見解,用於有選擇地渲染系統的可見部分嗎?我的意思是,只顯示可見的東西(相對於相機的位置),而不是渲染看不見的部分。 我使用VC++和GLUT API。
也許this Wikipedia article提供了一個非常基本介紹剔除技術領域。
一個好的起點和最簡單的技術之一是查看截錐體剔除。使用此方法,您可以檢查場景中的每個物體,如果它位於觀察體積內(觀看平截頭體)。這基本上相當於檢查幾何的一些簡化的邊界體積(如盒子或球體,完全包含幾何體),如果它位於由六個平面定義的視錐體內。
這可以通過按對象的位置對對象進行分組來進一步優化,並創建所謂的邊界卷層次結構。首先檢查整個城市街區是否在觀看體積內(通過使用包含整個街區的邊界體積),並且只有這樣纔會進一步檢查個別房屋。
一個更復雜的技術是遮擋剔除,這意味着檢查一個對象是否完全隱藏在另一個對象的後面。因爲這些技術可能會變得更復雜,所以應該(如果完成)實際上是在視錐截取之後完成的。 OpenGL具有硬件遮擋查詢,可以幫助您確定對象是否實際可見,但它們需要一些額外的工作才能正常工作。特別是對於城市來說,可能會有特殊的二維遮擋剔除技術(很久以前我聽說過這個,不知道)。
這只是一個非常寬泛的概述,隨意谷歌個別關鍵字。考慮到現在的趨勢是將盡可能多的幾何體分批到一次繪製調用(順便說一下,如果額外的CPU開銷是值得的(尤其是對於複雜的遮擋剔除技術),仔細加權總是一個好主意,我希望你不要使用即時模式glBegin/glEnd
,否則將它改爲頂點陣列或更好的VBO是你議程上的第一點)。但是,查看截錐體可能是一個不錯的和容易的出發點,特別是如果城市變得相當大。
對多邊形進行分區的經典BSP樹是現今時代的「儘可能多地將批處理調成單個繪圖調用」優化的圖形硬件的完全不起作用。並且不要讓文件以「.bsp」結尾,這會欺騙你,它與BSP樹有關(可能在最遠的意義上)。如果需要,這些文件應該以「.pvs」結尾。 –
謝謝你們幫忙和提供鏈接..我想我現在會去看看截錐體..如果我能處理這些東西,我可能會選擇閉塞剔除。:) – itsraining
有很多方法可以做到這一點。 Frustrum剔除(只繪製視圖端口中的內容),遮擋剔除(只繪製不完全遮蔽的東西),但僅列出兩個。也有部分渲染技術是你開始繪製,然後停止,當你達到這個幀的閾值時間。 – ChrisF
謝謝你@christian ..我將檢查那些...... OpenGl是否提供了預定義的函數來幫助這些方法?或者我們是否應該從頭開始實施算法? – itsraining
自從我活躍於3D圖形之後,我已經有一段時間了,所以我並沒有完全掌握最新的知識,但是很大程度上取決於您決定發送流水線的方式。 – ChrisF