洛下闲才子

导航

 

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之间,很好。

image

 

PS里除了ALU单元 还包括Shader Function

posted on 2010-07-14 22:37  洛下闲才子  阅读(379)  评论(0)    收藏  举报