📄 shadow.fx
字号:
// world * view * projection
float4 vLightPos;
float4x4 matWV;
float4x4 matIW;
float4x4 matP;
// 输入顶点格式
struct VS_IN
{
float3 p : POSITION;
float3 n : NORMAL;
float2 t : TEXCOORD0;
};
// 输出顶点格式
struct VS_OUT
{
float4 p : POSITION;
};
// 定点着色器
VS_OUT main( VS_IN In )
{
VS_OUT o = (VS_OUT)0;
float value;
// 光源变换为对象空间
float3 L = normalize( mul( vLightPos, matIW ) );
// 求得法线向量In.n和光源向量L的内积
// 内积值比0小的话,是指V的方向和法线的方向为90以上
// 对于这种向量,可以顺着L方向进行全部拉伸
// 否则就必须填入0,但是,填入0的话,会出现Z-fighting
// 阴影网格和原文件网格的斑点(stipple)被输出
// 为了防止出现这种现象,需要填入0.01
float dir = dot( In.n, L );
if( dir <= 0 )
value = 10;
else
value = 0.01;
// 顶点变换为光源前进方向
float3 P = In.p - (L*value);
// 顶点变换为裁剪坐标
P = mul( float4( P, 1 ), (float4x3)matWV );
o.p = mul( float4(P,1), matP );
return o;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -