1. 程式人生 > >《Compress data for deferred shadering's G-Buffer》

《Compress data for deferred shadering's G-Buffer》

data 頂點 解壓 中一 計算 ade 由於 pos 參考

對於Normal而言,因為是歸一化後的,所以只需要存儲x和y即可,有多種算法可以進行壓縮和解壓,這裏介紹其中一種比較不錯的:

float2 encode(float3 normal)
{
   return normalize(normal.xy) * sqrt(normal.z * 0.5 + 0.5);
}
float3 decode(float2 n)
{
   float3 normal;
   normal.z = dot(n, n) * 2 - 1;
   normal.xy = normalize(n) * sqrt(1 - normal.z * normal.z);
   return
normal; }

對於position的壓縮,由於在PS中的像素所在位置已經提供了x和y,可以由x和y計算出z;在GBuffer中可以存儲view space中的z除以far plane的值,而在lighting pass中PS拿到像素在view space的位置後計算:

p = view_dir * ((z * far_plane) / view_dir.z);

這樣得到的P值的z分量就是真正的view space中的z深度值;其中view_dir是VS傳到PS中的,在VS中計算過程是頂點乘上world*view矩陣的結果;

參考:http://www.klayge.org/2011/01/16/klayge%E4%B8%AD%E7%9A%84%E5%BB%B6%E8%BF%9F%E6%B8%B2%E6%9F%93%EF%BC%88%E4%BA%8C%EF%BC%89/

《Compress data for deferred shadering's G-Buffer》