shader 延遲渲染

2021-10-02 11:48:15 字數 2383 閱讀 1170

正向渲染(forward rendering),或稱正向著色(forward shading),是渲染物體的一種非常直接的方式,在場景中我們根據所有光源照亮乙個物體,之後再渲染下乙個物體,以此

類推。傳統的正向渲染思路是,先進行著色,再進行深度測試。 其的主要缺點就是光照計算跟場景

複雜度和光源個數有很大關係。假設有 n 個物體, m 個光源,且每個每個物體受所有光源的

影響,那麼複雜度就是 o(m*n)。

正向渲染簡單直接,也很容易實現,但是同時它對程式效能的影響也很大,因為對每乙個需

要渲染的物體,程式都要對每個光源下每乙個需要渲染的片段進行迭代,如果舊的片段完全

被一些新的片段覆蓋,最終無需顯示出來,那麼其著色計算花費的時間就完全浪費掉了。

可以將延遲渲染( deferred rendering)理解為先將所有物體都先繪製到螢幕空間的緩衝(即 gbuffer, geometric buffer,幾何緩衝區)中,再逐光源對該緩衝進行著色的過程,從而避免了

因計算被深度測試丟棄的⽚元的著色而產⽣的不必要的開銷。 也就是說 延遲渲染基本思想

是,先執行深度測試,再進行著色計算,將本來在物空 間(三維空間)進行光照計算放到了

像空間(二維空間)進行處理。

對應於正向渲染 o(m*n)的 複雜度,經典的延遲渲染複雜度為 o(n+m)。

延遲渲染原理:

延遲渲染主要包含了兩個pass。在第乙個pass中,我們不進行任何光照計算,而是僅僅計算哪些片元是可見的,這主要是通過深度緩衝技術來實現,當發現乙個片元是可見的,我們就把它的相關資訊儲存到g緩衝區中。然後,在第二個pass中,我們利用g緩衝區的各個片元資訊,例如表面法線、視角方向、漫發射係數等,進行真正的光照計算。

延遲渲染缺點:

1,不支援真正的抗鋸齒功能。

2,不能處理半透明物體。

3,對顯示卡有一定要求。如果要使用延遲渲染的話,顯示卡必須支援mrt、shader mode 3.0及以上、深度渲染紋理以及雙面的模板緩衝。

優點:1,所有光都是逐畫素光源。計算複雜度前向渲染 o(m*n),延遲渲染o(m+n)。

2,製作後處理等,可直接獲取深度值。

第乙個pass用於渲染g緩衝。在這個pass中,我們會把物體的漫反射顏色、高光發射顏色、平滑度、法線、自發光和深度等資訊渲染到螢幕空間的g緩衝區中。對於每個物體來說,這個pass僅會執行一次。

2)第二個pass用於計算真正的光照模型。這個pass會使用上乙個pass中渲染的資料來計算最終的光照顏色,再儲存到幀緩衝中。

預設的g緩衝區(注意,不同unity版本的渲染紋理儲存內容會有所不同)包含了以下幾個渲染紋理(render texture,rt)。

rt0:格式是argb32(每個通道8位),rgb通道用於儲存漫反射顏色,a通道儲存遮擋。

rt1:格式是argb32(每個通道8位),rgb通道用於儲存高光反射顏色,a通道同於用於儲存高光反射的指數部分。

rt2:格式是argb2101010,rgb通道用於儲存世界空間法線,a通道沒有被使用。

rt3:格式是argb2101010/argbhalf(每個通道16位),(高動態光照渲染/低動態光照渲染)用於儲存自發光+lightmap+反射探針深度緩衝和模板緩衝。

當在第二個pass中計算光照時,預設情況下僅可以使用unity內建的standard 光照模型。

延遲渲染**:

shader "myshader/002"

_diffuse("diffuse",color) = (1,1,1,1)

_specular("specular",color) = (1,1,1,1)

_gloss("gloss",range(1,50)) = 20

} subshader

lod 100

pass

cgprogram

#include"unitycg.cginc"

#pragma target 3.0

#pragma vertex vert

#pragma fragment frag

//排除不支援mrt的硬體

//#pragma exclude_renderers norm

#pragma multi_compile __ unity_hdr_on

sampler2d _maintex;

float4 _maintex_st;

float4 _diffuse;

float4 _specular;

float _gloss;

;struct v2f

;struct deferredoutput

;deferredoutput frag(v2f i)

endcg

} }}

此時,main camera的rendering path選擇deferred才能將物體顯示出來。

Shader 渲染流程

gpu graphics processing unit,影象處理器,gpu上有成千上萬核,這些核並行執行 cpu central processing unit,處理器,cpu通常有單核 雙核 四核和八核,但這些核只能序列操作。渲染流水線的工作任務在於由乙個三維場景出發 生成 或渲染 一張二維影象...

延遲渲染 Deferred Rendering

在計算機圖形學中,延遲渲染 deferred rendering 即延遲著色 deferred shading 是將著色計算延遲到深度測試之後進行處理的一種渲染方法。延遲著色技術的最大的優勢就是將光源的數目和場景中物體的數目在複雜度層面上完全分開,能夠在渲染擁有成百上千光源的場景的同時依然保持很高的...

延遲渲染路徑

此頁面將詳細介紹延遲渲染路徑。參見 wikipedia 延遲渲染以獲取介紹性的技術概述。當使用延遲渲染時,在單個gameobject物體上起作用的燈光的數量就沒有限制。所有的燈光都是逐畫素計算的,這意味著它們都能正確地與法線貼圖互動。除此之外,所有的燈光都能擁有剪影和陰影。延遲渲染的乙個優勢就是處理...