前面一篇文章介紹了混合方式的延遲渲染(hybrid deferred shading),本文來講解一下其中的乙個細節,由深度構建世界位置,我們這裡假定使用d3d9以及左手座標系。
我在這裡介紹兩種方式,這兩種方式也就跟實現方式有一定的關係。
方法1:
如果我們在第一遍中寫深度時使用的是經過透視除法的z值
1如果是在d3d10或者更高版本的dx中,我們可以直接讀取深度紋理,這樣就可以減少一張rt,所以用這種 方法會比較省。d3d9下通過一些方法也可以得到,比如intz或者驅動暴露給d3d9的介面[1]。//第一遍時輸出深度
2float4x4 matviewprojection;
3struct
vs_input 4;
8struct
vs_output 9;
1314
vs_output vs_main( vs_input input )
1522
23float4 ps_main(float2 idepth : texcoord0) : color0
2428
29//
在計算光照時獲取世界位置,此處僅為示例**
30struct
vs_output31;
35vs_output vs_main( float4 pos: position )
3644
45float4x4 finvmatviewproj;
46 sampler2d depthtexture; //
第一遍儲存的深度紋理
47float4 ps_main(float4 iuv : texcoord0) : color0
48
第二種方法為直接儲存攝像機空間中的z除以遠裁剪面後的值。
1我們目前使用的是第二種方法,效率也還好,不過如果我們不考慮更大範圍的支援老硬體,可能會使用參考文獻[1]中的方法直接讀取深度,這樣第一種方法就比較合適了,當然還有其它一些方法,我也沒有仔細去研究,讀者如果有興趣可以自己google,也可以參考[2]。相似三角形原理如下圖所示://第一遍時輸出攝像機空間的z值除以遠裁剪面的值
2float4x4 matviewprojection;
3float
ffarclipplane;
4struct
vs_input 5;
9struct
vs_output 10;
1516
vs_output vs_main( vs_input input )
1725
26 float4 ps_main(float
idepth : texcoord0) : color0
2730
3132
33//
在計算光照時獲取世界位置,利用相似三角形來求得。此處僅為示例**
34struct
vs_output35;
41vs_output vs_main( float4 pos: position , float4 vfarcorner : texcoord0)
4250
51float3 vcampos;
52 sampler2d depthtexture; //
第一遍儲存的深度紋理
53float4 ps_main(float2 iuv : texcoord0, float4 vfarcorner : texcoord1) : color0
54
其中x.z/ffardist即為上面**中的 1 output.depth = output.position.w / ffarclipplane ; ,乘以ffarvec這樣就得到了乙個向量,再加上世界空間中的攝像機位置就得到了最終的世界位置 。
延遲渲染 Deferred Rendering
在計算機圖形學中,延遲渲染 deferred rendering 即延遲著色 deferred shading 是將著色計算延遲到深度測試之後進行處理的一種渲染方法。延遲著色技術的最大的優勢就是將光源的數目和場景中物體的數目在複雜度層面上完全分開,能夠在渲染擁有成百上千光源的場景的同時依然保持很高的...
shader 延遲渲染
正向渲染 forward rendering 或稱正向著色 forward shading 是渲染物體的一種非常直接的方式,在場景中我們根據所有光源照亮乙個物體,之後再渲染下乙個物體,以此 類推。傳統的正向渲染思路是,先進行著色,再進行深度測試。其的主要缺點就是光照計算跟場景 複雜度和光源個數有很大...
延遲渲染路徑
此頁面將詳細介紹延遲渲染路徑。參見 wikipedia 延遲渲染以獲取介紹性的技術概述。當使用延遲渲染時,在單個gameobject物體上起作用的燈光的數量就沒有限制。所有的燈光都是逐畫素計算的,這意味著它們都能正確地與法線貼圖互動。除此之外,所有的燈光都能擁有剪影和陰影。延遲渲染的乙個優勢就是處理...