一般來(lái)說(shuō)normalMap都是從高模獲得,用來(lái)使低模渲染獲得更好的顏色效果
帖上一段凹凸貼圖的hlsl,不一定要用shader實(shí)現(xiàn),看懂原理就行了
struct VS_INPUT
{
float4 position : POSITION;
float3 normal : NORMAL;
float3 tangent : TANGENT;
float2 texcoord0 : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 position : POSITION;
float3 color0 : COLOR0;
float2 texcoord0 : TEXCOORD0;
};
VS_OUTPUT VS_PerpixelDiffuseLighting( VS_INPUT In )
{
VS_OUTPUT Out;
Out.position = mul( In.position, matWorldViewProj );
//Out.position.z -= 0.01;
//把光照方向轉(zhuǎn)到世界坐標(biāo)中,這樣可以避免把normal圖中得到的每點(diǎn)的normal值
//都轉(zhuǎn)到屏幕坐標(biāo)上來(lái),節(jié)約運(yùn)算
float3 worldNormal = normalize(mul( In.normal, (float3x3)matWorld ));
float3 worldTangent = normalize(mul( In.tangent, (float3x3)matWorld ));
float3 worldBinormal = cross( worldNormal, worldTangent );
float3 L = normalize( lightDir.xyz );
float3x3 tangentBase = { worldTangent, worldBinormal, worldNormal };
float3 LInTangent = mul( tangentBase, -L );
//顏色值只能是0-1.normal可以是-1-1,這里要進(jìn)行一次轉(zhuǎn)化
Out.color0 = float4( 0.5 * LInTangent + 0.5, 1 );
Out.texcoord0 = In.texcoord0;
return Out;
}
float4 PS_PerpixelDiffuseLighting( VS_OUTPUT In ) : COLOR
{
//取得normal圖上每點(diǎn)的normal
float3 pixelNormal = tex2D( sNormal, In.texcoord0 );
// 2*(pixelNormal-0.5) 是把0-1轉(zhuǎn)化為-1到1
//這一步就是normalmap的使用了,把光線方向與normal dot一下
float diffuse = dot( 2*(In.color0-0.5), 2*(pixelNormal-0.5) );
float3 texTerm = tex2D( sDiffuse, In.texcoord0 );
float4 finalColor = { texTerm*diffuse, 1 };
return finalColor;
}
這樣作的最終目標(biāo)是讓低模能夠獲得高模一樣的光照效果