2012-01-16 77 views
5

我有一個BSP樹加載到內存中。我首先發現我在什麼葉子。接下來,我解碼PVS。然後,我瀏覽該PVS中的每個區域,看看它是否在我的平截頭體內。我是否錯誤地渲染BSP樹?

我被告知這是渲染的不正確方式,而且實際上我應該通過遍歷BSP樹進行回到前面的渲染。我到底該怎麼做?我已經看到了許多不同的做法,這就是爲什麼我問。

例如,Quake 3 BSP渲染說: 遍歷BSP以確定攝像機位於哪個葉中。 檢索並解壓縮該葉子的PVS,遍歷PVS並在BSP中標記葉子。 穿越遠處的BSP 如果一個節點沒有標記,請跳過它。 測試節點邊界框​​對着相機Frustrum。 將當前頁面添加到再現列表中

這仍然是今天完成的標準方式,或者至少對於更簡單的遊戲。

+0

從前到後是現今的首選渲染;只有畫家的算法需要回到前面(即在壓縮之前,高帶寬的Z緩衝區使它們更好)。從前到後考慮到早期的z-rejects(除了確定和檢查其z值之外,在現代硬件中,除了你所繪製的任何東西都會被拒絕,之前做了很多工作)。當我多點時,我會再次發表評論。 – 2012-01-16 15:07:57

回答

1

正如OrgnlDave說:

當繪製一個圖元,放置在z緩衝器的前面的像素將是油漆和着色器程序將被執行。但是如果像素在場景後面,則像素被拒絕。沒有義務做到這一點,從前面到後面,但是性能上的收益是最差的。

但是,如果您使用混合對象,則需要在每個實體對象之後繪製該對象,並從後到前進行繪製。因爲您需要將顏色與剛放置的對象混合。

+0

@OrgnlDave說得好。像素填充是昂貴的。這是管道中需要對共享資源進行寫入訪問的一點。頂點着色器可以並行運行並同時生成幾何列表,但是當像素着色器寫入顏色緩衝區或Z緩衝區時,一次只能有一個程序訪問同一內存。將不透明幾何圖形從前向後渲染,以消除被遮擋物體上的像素填充,然後從後向前渲染非不透明幾何體,以便遮擋幾何體在alpha混合中具有權重。 – Dan 2012-06-03 19:02:50