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

将DirectX着色器应用于XNA中的旋转纹理,xna,rotation,directx,shader,Xna,Rotation,Directx,Shader,我有一个动态灯光着色器,在我自己的测试程序中,着色精灵很好,但一旦我将它导入朋友的基于物理的游戏中,它就开始类似eclipse了。我将渐变简化为完全基于形状内的X值,并使精灵中的圆外部变为红色,从而缩小了范围,但正如您所看到的,旋转继续导致问题(无法发布图像,因此这里是相册的链接) 以不同的旋转旋转圆(不按顺序,但用弧度值标记): 我对矩阵数学的所有研究都表明我使用了正确的旋转公式,但我想也许我做错了什么。以下是我的.fx着色器代码: float rotationrads; /*assumed

我有一个动态灯光着色器,在我自己的测试程序中,着色精灵很好,但一旦我将它导入朋友的基于物理的游戏中,它就开始类似eclipse了。我将渐变简化为完全基于形状内的X值,并使精灵中的圆外部变为红色,从而缩小了范围,但正如您所看到的,旋转继续导致问题(无法发布图像,因此这里是相册的链接)

以不同的旋转旋转圆(不按顺序,但用弧度值标记):

我对矩阵数学的所有研究都表明我使用了正确的旋转公式,但我想也许我做错了什么。以下是我的.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着色器中使用基于精灵的旋转的经验,我将非常感谢您的帮助!提前感谢

因为旋转是围绕原点执行的,所以必须将旋转中心(0.5,0.5)移动到原点,执行旋转,然后撤消平移。

因为旋转是围绕原点执行的,所以必须将旋转中心(0.5,0.5)移动到原点,执行旋转,然后撤消平移。

您到底在尝试什么?为什么要使用旋转的纹理坐标来改变颜色?你不想在新的位置对纹理进行采样吗?是的,本质上,圆是Farseer物理引擎中的一个身体部分,由于运动和被撞倒,阴影必须考虑到旋转的部分。正如您所看到的,当圆处于起始位置时,着色会起作用,左侧的着色会更暗。当我添加动态光源时,这也起作用。如果我不考虑旋转,黑暗会随着圆圈旋转,这对外部光源不起作用。对不起,我的编辑时间用完了。圆圈在XNA/Farseer中旋转。着色器必须保持阴影在左侧。不考虑旋转似乎会使阴影随着圆旋转,因此我需要考虑传递到着色器的旋转,以保持阴影在左侧。我感觉我的旋转算法出了问题,因为我把我为动态照明做的每一个计算都去掉了。啊,我明白了。围绕原点执行旋转。因此,您应该将tex坐标移动
(-0.5,-0.5)
,执行旋转并移动
(0.5,0.5)
。这很有效!我不能将你的评论标记为答案,但如果你将其转发到答案链接,我可以检查它,这样你就可以获得信用!我把代码改为:NewTex.x=((Tex.x-0.5)*cos(rotationrads))-((Tex.y-0.5)*sin(rotationrads))+0.5;NewTex.y=((Tex.y-0.5)*sin(旋转半径))+((Tex.y-0.5)*cos(旋转半径))+0.5;你到底想干什么?为什么要使用旋转的纹理坐标来改变颜色?你不想在新的位置对纹理进行采样吗?是的,本质上,圆是Farseer物理引擎中的一个身体部分,由于运动和被撞倒,阴影必须考虑到旋转的部分。正如您所看到的,当圆处于起始位置时,着色会起作用,左侧的着色会更暗。当我添加动态光源时,这也起作用。如果我不考虑旋转,黑暗会随着圆圈旋转,这对外部光源不起作用。对不起,我的编辑时间用完了。圆圈在XNA/Farseer中旋转。着色器必须保持阴影在左侧。不考虑旋转似乎会使阴影随着圆旋转,因此我需要考虑传递到着色器的旋转,以保持阴影在左侧。我感觉我的旋转算法出了问题,因为我把我为动态照明做的每一个计算都去掉了。啊,我明白了。围绕原点执行旋转。因此,您应该将tex坐标移动
(-0.5,-0.5)
,执行旋转并移动
(0.5,0.5)
。这很有效!我不能将你的评论标记为答案,但如果你将其转发到答案链接,我可以检查它,这样你就可以获得信用!我把代码改为:NewTex.x=((Tex.x-0.5)*cos(rotationrads))-((Tex.y-0.5)*sin(rotationrads))+0.5;NewTex.y=((Tex.y-0.5)*sin(旋转半径))+((Tex.y-0.5)*cos(旋转半径))+0.5;