1

私自身のテスト プログラムでは、シェーディングされたスプライトが問題ないダイナミック ライト シェーダーがありましたが、それを友人の物理ベースのゲームにインポートすると、日食に似てきました。シェイプ内の純粋に X 値に基づいてグラデーションを単純化し、スプライトの円の外側を赤にすることで絞り込みましたが、ご覧のとおり、回転は引き続き問題を引き起こします (画像を投稿できません)。 、アルバムへのリンクはこちら)。

異なる回転での円 (順序どおりではありませんが、ラジアン値でラベル付けされています): http://imgur.com/a/Preth

行列演算について調べたところ、回転に正しい公式を使用しているとのことですが、何か間違ったことをしている可能性があります。これが私の .fx シェーダー コードです。

float rotationrads; /*assumed rotation is in radians*/
sampler TextureSampler: register(s0);

float4 staticlight(float2 Tex: TEXCOORD0) : COLOR0
{
float4 Color = tex2D(TextureSampler, Tex);





    float2 NewTex;

    /*Get the new X and Y values by applying the UV formula with the rotation*/
    NewTex.x = (Tex.x * cos(rotationrads)) - (Tex.y * sin(rotationrads));
    NewTex.y = (Tex.y * sin(rotationrads)) + (Tex.y * cos(rotationrads));

if(Color.a > 0.0)
{
    Color.r = (Color.r * NewTex.x);
    Color.g = (Color.g * NewTex.x);
    Color.b = (Color.b * NewTex.x);
}
else
{
    Color.r = 100;
    Color.g = 0;
    Color.b = 0;
    Color.a = 100;
}


return Color;  
}

technique StaticLightOnly
{
pass Pass1
{
    PixelShader = compile ps_2_0 staticlight();
}
}

2D シェーダーでスプライト ベースの回転を使用した経験がある場合は、これについて何か助けていただければ幸いです。ありがとうございます!

4

1 に答える 1

1

回転は原点を中心に行われるため、回転中心(0.5、0.5)を原点に移動し、回転を実行してから、平行移動を元に戻す必要があります。

于 2013-03-21T09:16:45.423 に答える