在directx着色器中设置定向照明

时间:2012-07-17 22:20:37

标签: c# directx shader

尝试学习着色器并获得一个简单的定向光源,但我只是变黑了。如果我返回input.Col一切都很好,所以我知道这与这些正常的计算有关,但绝对不知道出了什么问题?我正在努力理解着色器,特别是从哪里获取/设置matWorld或应该是什么(我尝试将其设置为Identity矩阵),或者它是否是神奇地自己设置的东西。 worldViewProj我是从代码

设置的
float4 vecLightDir = normalize(float4(1.0f, 1.0f, 1.0f,0.0f));
float4x4 worldViewProj : WORLDVIEWPROJECTION;
float4x4 matWorld : WORLD;

struct VS_IN
{
    float4 Pos : POSITION;
    float4 Col : COLOR0;
    float3 Norm : NORMAL;
};

struct PS_IN
{
    float4 Pos : POSITION;
    float4 Col : COLOR0;
    float3 Light: TEXCOORD0;
    float3 Norm : TEXCOORD1;
};

PS_IN VS( VS_IN input )
{
    PS_IN Out = (PS_IN)0; 
    Out.Pos = mul(input.Pos, worldViewProj);
    Out.Light = normalize(vecLightDir); 
    Out.Norm = -normalize(mul(input.Norm, matWorld));
    Out.Col = input.Col;
    return Out;
}

float4 PS(PS_IN input) : COLOR
{
    float4 result=input.Col *(dot(input.Norm,input.Light));

    return result;
}

technique TVertexAndPixelShader
{
    pass P0
    {
        // shaders
        VertexShader = compile vs_2_0 VS();
        PixelShader  = compile ps_2_0 PS();
    }  
}

1 个答案:

答案 0 :(得分:0)

你有几个问题......

1)首先,像素着色器对三角形中的光和法线向量进行线性插值。这意味着当矢量到达灯光着色器时,它们不再被标准化。

2)为什么要将光矢量传递到顶点组件中的顶点着色器?为什么不将它作为常量发送到像素着色器,从而绕过任何插值问题?