0

シェーダーを学習して、非常にシンプルな指向性光源を機能させようとしていますが、真っ黒になってしまいます。input.Col を返すとすべて問題ないので、これらの通常の計算に関係していることはわかっていますが、何が問題なのかまったくわかりませんか? 私はシェーダーを理解するのに苦労しています。具体的には、matWorld をどこから取得/設定するか、または何をすべきか (ID マトリックスに設定しようとしました)、またはそれが魔法のようにそれ自体で設定されるものであるかどうかを理解するのに苦労しています。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();
    }  
}
4

1 に答える 1

0

さて、いくつかの問題があります...

1) まず、ピクセル シェーダーは、三角形を横切る光と法線ベクトルの線形補間を実行します。これは、ベクトルがライト シェーダーに到達したときに、ベクトルが正規化されなくなったことを意味します。

2)頂点コンポーネントの頂点シェーダーを介してライトベクターを渡すのはなぜですか? それを定数としてピクセル シェーダーに送信して、補間の問題を回避してみませんか?

于 2012-07-20T14:35:26.223 に答える