图片渲染延迟_前向渲染与延迟渲染
如果您開發過3D游戲,那么您可能會在現代圖形引擎的研究中遇到術語“前向渲染”和“延遲渲染”。
而且,通常,您必須選擇一種在游戲中使用。但是它們是什么,它們有什么不同,應該選擇哪一個?
許多燈光的延遲渲染(圖片由Hannes Nevalainen提供)現代圖形管道
首先,我們需要對現代的或可編程的圖形管線有所了解。
過去,我們在顯示卡圖形處理方面所受的限制。除了發送不同的紋理外,我們無法更改其繪制每個像素的方式,并且一旦頂點在卡上就無法扭曲頂點。但是時代變了,我們現在有了可編程的圖形管線。現在,我們可以將代碼發送到顯卡,以更改像素的外觀,使它們具有法線貼圖的凹凸外觀,并增加反射效果(以及極大的真實感)。
該代碼采用geometry,vertex和fragment shader的形式,它們實質上改變了顯卡渲染對象的方式。
可編程圖形管線的簡化視圖前向渲染
前向渲染是大多數引擎使用的標準,即用型渲染技術。您為圖形卡提供幾何圖形,將其投影并將其分解為頂點,然后將其轉換并拆分為片段或像素,這些片段或像素將在傳遞到屏幕之前進行最終的渲染處理。
前向渲染:幾何著色器到頂點著色器到片段著色器它是相當線性的,并且每次將每個幾何圖形向下通過管道一次以生成最終圖像。
延遲渲染
顧名思義,在延遲渲染中,渲染將延遲一點,直到所有幾何圖形都通過管道為止。然后通過在最后應用陰影來生成最終圖像。
現在,我們為什么要這樣做?
延遲渲染:頂點到片段著色器的幾何形狀。傳遞到多個渲染目標,然后使用照明進行著色。延遲照明是對延遲渲染的一種修改,它通過在場景中使用更多遍來減小G緩沖區的大小。
照明性能
照明是走一條路線而不走另一條路線的主要原因。在標準的前向渲染管線中,必須對可見場景中的每個頂點和可見場景中的每個片段執行照明計算。
如果您的場景具有100個幾何圖形,并且每個幾何圖形都有1,000個頂點,那么您可能有大約100,000個多邊形(非常粗略的估計)。顯卡可以很輕松地處理此問題。但是,當這些多邊形被發送到片段著色器時,就會在此處進行昂貴的照明計算,并可能發生真正的減速。
開發人員嘗試將盡可能多的光照計算推入頂點著色器,以減少片段著色器必須完成的工作量。
必須為屏幕上每個多邊形的每個可見片段執行昂貴的照明計算,無論其是否重疊或被另一個多邊形的片段隱藏。如果屏幕的分辨率為1024x768(絕對不是很高的分辨率),則需要渲染近800,000像素。您每幀可以輕松完成一百萬個片段操作。而且,許多碎片永遠不會進入屏幕,因為它們經過深度測試已被移除,因此照明計算被浪費了。
如果您有一百萬個這樣的片段,并且突然間您必須為每個燈光重新渲染該場景,那么您就跳到了[num lights] x 1,000,000每幀的片段操作!想象一下,如果您有一個充滿路燈的城鎮,而每個鎮都是一個點光源...
可以使用大O表示法來編寫用于估算此前向渲染復雜度的公式,如O(num_geometry_fragments * num_lights)。您可以在此處看到復雜度與幾何圖形數量和燈光數量直接相關。
碎片是可能的像素,如果深度測試未將其剔除,它們將最終出現在屏幕上。
現在,一些引擎通過切掉遠處的燈光,組合燈光或使用光照貼圖(非常流行,但靜態)來優化此效果。但是,如果您需要動態光源以及很多動態光源,我們需要一個更好的解決方案。
延遲渲染以進行救援
延遲渲染是一種非常有趣的方法,它減少了對象數量,特別是減少了總片段數,并在屏幕上的像素上執行了照明計算,從而使用分辨率大小代替了總片段數。
大O標記表示的延遲渲染的復雜度為:O(screen_resolution * num_lights)。
您可以看到,現在屏幕上確定有多少個對象都無關緊要,因此您可以愉快地增加照明數量。(這并不意味著您可以擁有無??限的對象,它們仍然必須繪制到緩沖區以產生最終的渲染結果。)
讓我們看看它是如何工作的。
大心臟的延遲渲染
使用多個渲染目標,將每個幾何圖形(但不帶陰影)渲染到多個屏幕空間緩沖區。特別是,深度,法線和顏色都寫入了單獨的緩沖區(圖像)。然后將這些緩沖區組合起來,以為每個光提供足夠的信息以照亮像素。
Color,Depth和Normal緩沖區。(圖片來自astrofa,通過Wikimedia Commons。)使用三個緩沖區生成的最終照明(陰影)結果。(圖片來自astrofa,通過Wikimedia Commons。)通過知道像素有多遠及其法線向量,我們可以將像素的顏色與光線結合起來以生成最終的渲染。
如何選擇正確的渲染哪個?
簡單的說,如果您使用許多動態光源,則應使用延遲渲染。但是,存在一些重大缺點:
- 此過程需要具有多個渲染目標的顯卡。舊顯卡沒有此功能,因此無法使用。
- 它需要更高帶寬。G-buff的原因,延遲渲染需要大量緩沖區,舊的顯卡可能也無法處理。
- 不能使用透明對象。(可以配合前向渲染結合在一起,解決此問題。)
- 沒有抗鋸齒。但也有解決方案:邊緣檢測,FXAA。
- 除非您使用對延遲渲染的修改稱為Deferred Lighting,否則僅允許一種類型的材料。
- 陰影仍然取決于燈光的數量,延遲渲染無法解決此問題。
如果您沒有很多燈光或者希望能夠在較舊的硬件上運行,則應堅持使用前向渲染,并用靜態光照貼圖替換很多燈光,結果也是很棒的。
結論
我希望此文會幫助你們對前向渲染和延遲渲染有所了解。您可以使用各種選項來解決渲染問題,但是在游戲開發開始時選擇正確的選項非常重要,以避免以后出現困難的更改。
另外在U3D中還有頂點光照渲染,其功能完全可以在延遲渲染中實現,所以沒有單獨拿出來討論.
總結
以上是生活随笔為你收集整理的图片渲染延迟_前向渲染与延迟渲染的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝塔面板部署nuxt_MacOS下创建及
- 下一篇: 两个列表合并去重_花生AI论文去重V1.