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

登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

主選單

T3DFX Developer Network 討論區索引
   Real-Time Global Illumination
     為何使用radiosity normal mapping ?????(摘錄自my msn blog 10/5/2005)

討論串 | 最新的先 前一主題 | 下一主題 | 底部
張貼者 討論串
vr3d
張貼於: 2006/9/23 3:38
管理員
註冊日: 2006/8/25
來自: 台灣
張貼數: 32
為何使用radiosity normal mapping ?????(摘錄自my msn blog 10/5/2005)

為何使用radiosity normal mapping ?????
傳統的3d game engine 最常使用的lighting 技術就是使用light map(用手繪or 3ds max or maya 等tools 產生,or 使用ray trace or radiosity 演算法,如Quake 系列,and My T3D 2,3,4(FX)系列,unreal 系列,& half-life 系列),因為是事先算好的light,
所以跟light的數量無關!!!

但新一代的3d lighting 強調per pixel lighting的技術(Bump Mapping),可以增強場景的精緻度,但當light 數量增加時,將會
增加render pass,如2盞燈將需至少2次的pass render!!!
縱使經過最佳化的處理,還是會很耗GPU的運算cost(如Doom3)!!!!

如果使用light map又不能結合bump mapping,因為light map 的每個texel 存的是light vector dot normal
的value,沒辦法再拿來dot normal map !!!

這也就是要使用Radiosity Normal Mapping 來解決
這個問題!!!


最早使用Radiosity Normal Mapping 是Half-Life 2 的source engine!!!

在GDC 2004 的power point 文件大略描述了他的方法,透過看圖說故事的方式,我也完成了我自己的Radiosity Normal Mapping,更進一步完成
Radiosity Parallax(Offset or Virtual Displacement) Mapping!!!


Radiosity Normal Mapping基本上分兩大部分
1.Shader(Vertex Shader & Pixel Shader) code!!!

2.Radiosity Program 計算出Projected Light Vector Value,and 存成3 張LightMap+1張原始的Light Map!!!

what is Projected Light Vector Value??

為了讓lightmap 結合normal map,我們需存下
light information 以供pixel shader階段
與normal map 做Dot !!!所以我們可以找出一組適當的Basis Vectors for BumpMapping!!!

如GDC 2004 文件所示!!!

我們都知道 VECTOR SPACE 的VECTOR,
可以使用BASIS VECTOR 的Linear combination v=w1B1+w2B2+w3B3
來表示B1,B2,B3 是BASIS VECTORS,
w1,w2,w3 相當於v project onto B1,B2,B3
的value


所以在Radiosity 中計算的熱能量及方向vector需投影到basis vectors最後轉成3 張light map ,每個basis vector一張!!!


因為Light Vector=LW1*B1+ LW2*B2+LW3*B3
Normal Vector=NW1*B1+ NW2*B2+NW3*B3

Light Dot Normal=LW1*NW1+LW2*NW2+LW3*NW3


其中B1,B2,B3為OrthoNormal故為1


故在Shader code就可簡化成3張lightmap blending
normal weight!!!!



以下為部分shader code

struct VS_OUTPUT
{
float4 Pos: POSITION;
float2 Base: TEXCOORD0;
float4 LightMap1and2: TEXCOORD1;
float2 LightMap3: TEXCOORD2;
float2 Bump: TEXCOORD3;
};
VS_OUTPUT Effect_Group_1_Radiosity_NormalMap_Pass_0_Vertex_Shader_RadiosityNormalMap_Main( float4 inPos: POSITION,float2 Base:TEXCOORD0,float2 LightMap:TEXCOORD1,
float2 LightMapOffset:TEXCOORD2 )
{
VS_OUTPUT Out;
Out.Pos = mul(matViewProjection, inPos);
Out.Base=Base;
float2 L1=LightMap+LightMapOffset;
float2 L2=L1+LightMapOffset;

Out.LightMap1and2=float4(L1,L2);
Out.LightMap3=L2+LightMapOffset;
Out.Bump=Base;
return Out;
}

struct PS_INPUT
{
float2 Base: TEXCOORD0;
float4 LightMap1and2: TEXCOORD1;
float2 LightMap3: TEXCOORD2;
float2 Bump: TEXCOORD3;
};

float4 Effect_Group_1_Radiosity_NormalMap_Pass_0_Pixel_Shader_ps_main( PS_INPUT IN ) : COLOR0
{

float3 fNormal=tex2D(NormalMap,IN.Bump)*2-1;
float4 fBase=tex2D(Base,IN.Base);

float4 fLWeight1=tex2D(LightMap,IN.LightMap1and2.xy);
float4 fLWeight2=tex2D(LightMap,IN.LightMap1and2.zw);
float4 fLWeight3=tex2D(LightMap,IN.LightMap3);

float4 fLN_Dot=dot(fNormal,hBumpBasis[0])*fLWeight1
+dot(fNormal,hBumpBasis[1])*fLWeight2
+dot(fNormal,hBumpBasis[2])*fLWeight3;



return fBase*fLN_Dot;
}



以上的技術架構在powerful 的t3dfx engine 只花兩個工作天,主要是繼承 t3dfx radiosity class 加入bump basis 的運算與投影及貼圖座標的修正
及pack 3張 lightmap!!!



radiosity normal map 的lighting 的部分原理與PRT(Precomputed Radiance Transfer)有點雷同,不一樣的地方在basis space 不同!!!

radiosity normal map在卡氏座標basis
PRT在球座標Spherical Harmonics basis

另外,

radiosity normal map用在static scenes and light and shadow,
效率好

PRT 可以做到REAL TIME SHADOW(low frequency soft shadow)
但prt假設light 距離很遠,不適合 室內lighting(必須做額外規劃限制)
但適合室外lighting


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

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

 


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

Powered by XOOPS 2.0 © 2001-2003 The XOOPS Project