shadow.fx

来自「《3D游戏编程》随书光盘 12章: 设计阴影的多种技巧, 有详细源代码」· FX 代码 · 共 49 行

FX
49
字号


// world * view * projection
float4x4	matWV;
float4x4	matProj;
float4x4	matShadowUV;

//  输入顶点格式
struct VS_IN
{
	float3	p : POSITION;
	float3	n : NORMAL;
	float2	t : TEXCOORD0;
	float2	s : TEXCOORD1;
};

// 输出顶点格式
struct VS_OUT
{
	float4	p : POSITION;
	float4	d : COLOR0;
	float2	t : TEXCOORD0;
	float2	s : TEXCOORD1;
};

// 顶点着色器
VS_OUT main( VS_IN In )
{
	VS_OUT	o = (VS_OUT)0;
	// matShadowUV : vertex local -> world -> light -> clip space
	// 顶点坐标变换为纹理坐标系
	// 首先将顶点坐标变换为光源空间裁剪坐标系clip space( -1 ~ 1 )
	float4 T = mul( In.p, matShadowUV );

	// 将裁剪坐标系变换为纹理坐标系
 	// clip space(-1 ~ 1) -> tex space( 0 ~ 1 )
 	o.s.x = (T.x / 2.0f) + 0.5f;
 	o.s.y = 1.0f - ((T.y / 2.0f) + 0.5f);
// 	o.s = float2( T.x, T.y ) / 2.0f + 0.5f;// 这样的话,纹理的上下部位就可以翻转过来
	
	// 将顶点坐标变换为摄像机空间裁剪坐标系
	float3 P = mul( float4(In.p,1), (float4x3)matWV );
	o.p = mul( float4(P,1), matProj );
	o.d = 1.0f;
	o.t = In.t;
	
	return o;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?