这个例子主要说明ParallaxOcclusionMapping,同时采用了另外两种方法作为对比:Bump mapping和Parallax mapping with offset limiting。
从简单到复杂为BUMPMAP、PM、POM,本文按此顺序说明。
Bump mapping
这种方法就是简单的法向贴图。
VS输入为pos、tex、normal
需要计算出输入到PS的vLightTS和vViewTS,其中vViewTS计算镜面反射光使用。
世界空间:
vLightWS=g_LightDir
vViewWS=g_vEye-vPositionWS
转换到切线空间:
vLightTS = mul( vLightWS, mWorldToTangent );
vViewTS = mul( mWorldToTangent, vViewWS );
PS输入为tex、vLightTS、vViewTS
计算结果通过公用函数ComputeIllumination:
// 采样法向贴图得到像素法向
float3 vNormalTS = normalize( tex2D( tNormalHeightMap, texCoord ) * 2 - 1 );
// 采样纹理贴图
float4 cBaseColor = tex2D( tBase, texCoord );
// Compute diffuse color component:
float3 vLightTSAdj = float3( vLightTS.x, -vLightTS.y, vLightTS.z );
float4 cDiffuse = saturate( dot( vNormalTS, vLightTSAdj )