⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shadow.fx

📁 《3D游戏编程》随书光盘 12章: 设计阴影的多种技巧, 有详细源代码
💻 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 + -