float4x4 WorldViewProj : WorldViewProjection < string UIWidget="None"; >;
float4x4 WorldXf : World < string UIWidget="None"; >;
float3 Light0Pos : Position <
string Object = "PointLight0";
string UIName = "PointLight0 Position";
string Space = "World";
> = {-0.5f,2.0f,1.25f};
float3 Light0Color : Diffuse <
string Object = "PointLight0";
string UIName = "PointLight0 Color";
string UIWidget = "Color";
> = {1.0f, 1.0f, 1.0f};
struct VS_INPUT
{
float4 Position : POSITION;
float3 Normal : Normal;
};
struct VS_OUTPUT
{
float4 Position : POSITION;
float3 WorldNormal : TEXCOORD0;
float3 WorldPosition: TEXCOORD1;
};
VS_OUTPUT mainVS(VS_INPUT In)
{
VS_OUTPUT Out;
Out.Position = mul(float4(In.Position.xyz, 1.0f), WorldViewProj);
Out.WorldNormal = mul( In.Normal, (float3x3) WorldXf);
Out.WorldPosition = mul( In.Position, WorldXf).xyz;
return Out;
}
float4 mainPS(VS_OUTPUT In) : COLOR
{
float4 color;
float3 vDir = normalize(Light0Pos - In.WorldPosition);
//漫反射光的计算法则
//没有材质
color.rgb = Light0Color * saturate(dot(vDir, In.WorldNormal));
color.a = 1.0f;
return color;
}
technique technique0
{
pass p0
{
VertexShader = compile vs_2_0 mainVS();
PixelShader = compile ps_2_0 mainPS();
CULLMODE = NONE;
}
}
shader 在FX Composer中调过了
所谓逐像素的光照计算,将光照计算挪到了像素阶段,开销变大了,这个其实跟Phong的光照模型就差不多意思了
在每个像素上不插值光照值,改插法线了。
float3 WorldNormal : TEXCOORD0;
float3 WorldPosition: TEXCOORD1;
对于每个像素的纹理坐标是进行透视矫正差值的(这是对的,仿射差值是错的),WorldNormal 与WorldPosition放在纹理坐标中就直接进行了插值了。
PS中就是漫反射光照的计算了,不过没有带材质.
saturate函数把值控制在0和1之间,很好。
PS里除了ALU单元 还包括Shader Function
浙公网安备 33010602011771号