|
|
VertexShader需要完成的工作是,把光照方向(g_vecDirLight,世界坐标系)转到切线空间来。
部分代码如下:
float4x4 g_matWorld;
float4 g_vecDirEye;
struct VS_OUTPUT
{
float3 view : TEXCOORD2;
};
VS_OUTPUT VSMain( float4 inPos OSITION, float2 inUV:TEXCOORD, float3 inNor:NORMAL, float3 inTangent : TANGENT )
{
VS_OUTPUT output=( VS_OUTPUT ) 0;
// omit some codes here...
float3x3 matWorld2TangentSpace;
matWorld2TangentSpace[0]=mul( inTangent, g_matWorld );
matW orld2TangentSpace[1]=mul( cross( inTangent, inNor ), g_matWorld );
matWorld2TangentSpace[2]=mul( inNor, g_matWorld );
//原程序:
//float3 posInWorld = normalize(mul( inPos, g_matWorld));
//本人的程序:
float3 posInWorld=mul( inPos, g_matWorld );
float3 vecDirView=g_vecDirEye-posInWorld;
//原程序:
//output.view=mul( matWorld2TangentSpace, vecDirView );
//本人的程序:
output.view=mul( vecDirView, matWorld2TangentSpace );
return output;
}
现在的情况是,原程序和本人的程序的显示结果差不多,也正因为结果差不多,带来了一些疑惑:
1、为什么原程序的posInWorld需要normalize?
我认为既然posInWorld是拿来和g_vecDirEye相减的,就不能normalize
2、为什么原程序中是mul( matWorld2TangentSpace, vecDirView )而不是mul( vecDirView, matWorld2TangentSpace )?
经过转换,matWorld2TangentSpace和vecDirView同在World坐标系中,如果是mul( vecDirView, matWorld2TangentSpace )就很容易理解,是把vecDirView转到matWorld2TangentSpace坐标系中,即转到了切线空间了。
但这样如何解释原程序中的mul( matWorld2TangentSpace, vecDirView )? |
|