T3DFX Developer Network - 新世代3D 引擎 FOR GAME

登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

主選單

T3DFX Developer Network 討論區索引
   Real-Time Global Illumination
     Spherical Harmonics LightMap in Local XZ Frame & Cook-Torrance BRDF (轉載自my msn blog(2008/11/02)

討論串 | 最新的先 前一主題 | 下一主題 | 底部
張貼者 討論串
vr3d
張貼於: 2008/11/16 16:56
管理員
註冊日: 2006/8/25
來自: 台灣
張貼數: 32
Spherical Harmonics LightMap in Local XZ Frame & Cook-Torrance BRDF (轉載自my msn blog(2008/11/02)
2008年11月2日
Spherical Harmonics LightMap in Local XZ Frame
最近由於賦閒在家,在工作期間有不少idea想做,但無法在工作期間做,所以就利用這段時間來完成它!!!

總共做了兩項:

1.Clipmap for Terrain=>類似id software的MegaTexture for DX9!!!

2.Spherical Harmonics LightMap in Local XZ Frame!!!

這次先談 Spherical Harmonics LightMap in Local XZ Frame,因為這比較有個人的方法在裡面!!!

我的引擎在t3dfx 4.0 (2005年)有增加類似Half-Life2 的Radiosity Normalmapping 的技術,也曾經在2005年my blog講過,大概在那時間我也想試使用Spherical Harmonics LightMap 來取代,但考量到記憶體及效能問題而作罷,而我當時也希望完全使用real-time而不要預先計算的方式,所以就不再考慮!!!

雖然引擎在2005就已經可以做次世代的遊戲,但沒有合適的合作對象,一直到2006年底,因為經濟因素到泰偉電子工作/_\,之後就中斷開發,最近2008年8月離職後,利用一些空餘時間,把最近有興趣的主題實作一下!!!

2007年底我玩Unreal 3的編輯工具,我發覺LightMap還是遊戲主流,因為當燈光太多的時候如果完全及時運算,對遊戲而言還是太傷效能,尤其不希望遊戲場景都昏昏暗暗(比較適合恐怖遊戲)時,使用預先算好的方法(如 Radiosity,Photon Mapping)並存成LightMap的形式還是蠻受遊戲青睞!!!

在GDC2008,HALO3 的製作公司有講到他們的Lighting System

使用Spherical Harmonics LightMap,也是LightMap Type!!!



雖然Unreal3我不知道使用何種方法,但就如同Crysis Engine 一樣是一種所謂的Directional LightMap,取平均light vectors,並存在lightmap data內,不管何種方法反正LightMap不再像傳統作法只存irradiance

(normal dot-product light vector),而是存Incident Radiance 投影到Basis Function or Basis Vector的參數 or 平均的light vector!!!

最近因讀Halo3 在 Siggraph08 Course 的資料[1],讓我有點興趣,

***簡單說明:*****

[Spherical Harmonics lightmap 的原理類似Irradiance Environment Maps [3] ,只是這裡的lightmap 的取樣位置在牆壁or地板or天花板等不同位置可以想像成每個位置放了一個light probes!!!在lightmap 的取樣點捕捉不同的Incident Radiance(來自四周的Radiance,in tangent space)並投影到SH basis function(在此選擇Quadratic,RGB各 9 個係數),然後儲存到LightMap Data!!!因為是在Frequency Domain,而依據[3]的實驗,diffuse light 通常變化得很smooth,屬於low frequency訊號,使用9 個係數誤差已很小!!!當run-time時在shader內,依據[3,6]的公式,可以使用Normal vector來evaluate出diffuse color!!!]





而且我2005年就想做了,所以我沿用2005年就寫好的radiosity normal mapping的code,繼承並稍微修改,再加上也是同一年的spherical harmonics 相關function很快的大約1天的時間就完成sh lightmap的diffuse部分!!!!

因為我在2006年時曾讀過一篇I3D06的論文[2],他使用Separable Approximation方法,將quadratic sh (9 係數),壓縮成4個,所以我就想try看看,大約2個工作天完成!!!但這種方法有缺點,雖然比較省memory(從RGB 分別9個係數(9*3)/每個lightmap texel 減少成(4*3)/每個lightmap texel),但如果要加上BRDF的話還要額外的LightMap data!!!!,而且lightmap 的data無法再供其他用途使用,如拿來給動態物件照明使用!!!而且使用此法在BRDF的參數調整也不方便,要改變參數須重算LIGHTMAP!!!而且brdf 的table 無法共用,不同roughness參數須不同table,不太實際!!!





後來在資料[1]裡面提到有關Cook-Torrance BRDF(Bidirectional Reflectance Distribution Function)實作時有提到LOCAL XZ-PLANE 座標的概念,這裡假設brdf 是isotropic,所以sh的係數從9個變成6個!!!我就是依據這個概念把sh lightmap 預先轉換到local xz-frame

所以變成 (6*3)/per lightmap texel 係數!!!而diffuse & cook-torrance brdf都只需靠look-up table來完成!!!也可延伸其他isotropic brdf上,如Phong-Like Brdf!!!另外不管roughness參數or Fresnel參數改變都不需重算lightmap,且brdf table 可共用,所以當計算好lightmap後可以在editor內調整 material 參數,就可以直接看到效果!!!

由於lightmap data 在 local xz-frame,當在pixel shader內計算cook-torrance brdf 時,不須再做SH Rotation,完全使用查表來取代!!!

這個方法大概花了2個工作天!!!

此法我稱為Spherical Harmonics LightMap in Local XZ Frame!!!

在整個實驗過程總共用了3種方法來實作,如果包含自己建構場景測試及調整數值及除錯整個大概花15個工作天!!!

以下包含部分shader source code!!!尚未最佳化版本!!!

這是我想的方法,靈感來自[1][2][3][4]資料!!!

Fast, Isotropic Cook-Torrance BRDF for Low Frequency Lighting Using Spherical Harmonics LightMap in Local XZ-Frame!!!



/*

% Spherical Harmonics LightMap
% using Local XZ frame Method
% for isotropic cook-torrance BRDF
% T3DFX Evolution 3D Engine (c) 1995-2008

keywords: Spherical Harmonics,sh,LightMap,local xz-frame

date: 2008/10/23
author: 聶廷燁

*/

float4 SH_XZ_PS(PS_INPUT IN) : COLOR
{
float4 diffuse = tex2D(Base,IN.Base);
float3 normal=((tex2D(NormalMap,IN.Base))*2-1);
float3 normal_detail=((tex2D(NormalMapDetail,IN.Base*10))*2-1);

normal.xy=normal.xy+normal_detail.xy*fDetailNormalScale;

float3 n_index = normalize(normal)*0.5+0.5;

float2 xFrame = float2(saturate (n_index.x*n_index.x+n_index.y*n_index.y),0.25);
float4 xzframe1=(tex2D(XZFrameSample1,xFrame));
float4 xzframe2=(tex2D(XZFrameSample1,float2(xFrame.x,0.75)));

float3 sh[6];


SH_MAP(IN,sh); // decode light map

float4 sh_r =float4(sh[0].r,sh[1].r,sh[2].r,sh[3].r);
float4 sh_g =float4(sh[0].g,sh[1].g,sh[2].r,sh[3].g);
float4 sh_b =float4(sh[0].b,sh[1].b,sh[2].r,sh[3].b);
float r = dot(sh_r,xzframe1)+dot(float2(sh[4].r,sh[5].r),xzframe2.xy);
float g = dot(sh_g,xzframe1)+dot(float2(sh[4].g,sh[5].g),xzframe2.xy);
float b = dot(sh_b,xzframe1)+dot(float2(sh[4].b,sh[5].b),xzframe2.xy);
float4 IrradMap = float4(r,g,b,1);



// cook-torrance brdf

float3 right = float3(1,0,0);
right = normalize(right-dot(right,normal)*normal);
float3 left = cross(normal,right);

float3 rr =normalize(IN.ViewDir);
float3 local_r = float3(dot(right,rr),dot(left,rr),dot(normal,rr));

float3 frameZ = float3(0,0,1);
float3 frameX = local_r-dot(local_r,frameZ)*frameZ;

float2 brdf_index = float2(dot(local_r,frameX),fRoughness); //roughness of cook-torrance brdf

float4 Brdf1=(tex2D(CookTorranceBRDFSample,brdf_index));
float4 Brdf2=(tex2D(CookTorranceBRDFSample1,brdf_index));
float4 Brdf12=(tex2D(CookTorranceBRDFSample2,brdf_index));

float3 f0 =1-vFresnel0;// Fresnel

float4 r67 = float4(sh[4].r,sh[5].r,sh[4].r,sh[5].r)*Brdf12;
float4 g67 = float4(sh[4].g,sh[5].g,sh[4].g,sh[5].g)*Brdf12;
float4 b67 = float4(sh[4].b,sh[5].b,sh[4].b,sh[5].b)*Brdf12;

r = lerp(dot(sh_r,Brdf1)+dot(r67.xy,1),dot(sh_r,Brdf2)+dot(r67.zw,1),f0.x);
g = lerp(dot(sh_g,Brdf1)+dot(g67.xy,1),dot(sh_g,Brdf2)+dot(g67.zw,1),f0.y);
b = lerp(dot(sh_b,Brdf1)+dot(b67.xy,1),dot(sh_b,Brdf2)+dot(b67.zw,1),f0.z);
float4 Spec = float4(r,g,b,1);
float4 color = (diffuse*IrradMap/3.14159+diffuse.a*Spec*fGlossyItensity);

return (1-exp(-color*0.6));

}



有關BRDF,Radiance,irradiance,Spherical Harmonics,radiosity normal mapping 的介紹,可參考[7]這是2008最新版本!!!

以下的抓圖,是我使用t3dfx radiosity engine 來計算SH Lightmap

這是簡單場景demo,場景中只有一盞白色燈光,畫面上出現紅色光是因為天花板有紅色材質而造成反射,就是所謂的color bleeding效果!!!


go http://homepage.seed.net.tw/web/nieh_home to download












參考資料

1.Hao Chen,Xinguo Liu,2008,"Lighting and Material of Halo3",SIGGRAPH 2008 Advanced in Real-Time Rendering in 3D Graphics And Games course notes,2008

2.Peter-Pike Sloan,2006,"Normal Mapping for Precomputed Radiance Transfer",I3D 2006.

3.Ravi Ramamoorthi,Pat Hanrahan,2002,"An Efficient Representation for Irradiance Environment Maps", SIGGRAPH 2002.

4.Jan Kautz,Peter-Pike Sloan,John Snyder,2002,"Fast,Arbitrary BRDF Shading for Low-Frequency Lighting Using Spherical Harmonics."the 13th Eurographics Workshop on Rendering 2002.

5.Peter-Shirley,Kenneth Chiu,1997,"A Low Distortion Map Between Disk And Square",Journal of Graphics Tools,1997.

6.Ravi Ramamoorthi,Pat Hanrahan,2001,"On the relationship between radiance and irradiance:determing the illumination from image of convex Lambertian object",Journal of The Optical Society of America,2001

7.Tomas Akenine-Moller,EricHaines,NatyHoffman,2008,"Real-Time Rendering",Third Edition,AK PETERS,2008




----------------
3D Madness

討論串 | 最新的先 前一主題 | 下一主題 | 頂部

 


  首頁  |  新聞區  |  討論區  |  網站連結  |  檔案下載  |  常見問題與解答 

Powered by XOOPS 2.0 © 2001-2003 The XOOPS Project