将DirectX着色器应用于XNA中的旋转纹理

时间:2013-03-19 03:01:30

标签: xna rotation directx shader

我有一个动态灯光着色器,在我自己的测试程序中阴影精灵很好,但是一旦我将它导入我朋友的物理游戏中就开始类似日食。我通过将渐变简化为纯粹基于形状中的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着色器中有基于精灵的旋转经验,我将非常感谢您的帮助!先谢谢!

1 个答案:

答案 0 :(得分:1)

由于围绕原点执行旋转,您必须将旋转中心(0.5,0.5)移动到原点,执行旋转然后撤消平移。