2013-03-19 65 views
1

我有一个动态光源着色器,在我自己的测试程序中阴影精灵很好,但是一旦我将它导入到我的朋友基于物理的游戏中,就开始类似于日食。我通过简化渐变来缩小它的范围,纯粹基于形状内的X值,并使精灵中的圆的外侧变成红色,但正如您所看到的,旋转继续导致问题(无法发布图像,所以这里是相册的链接)。将DirectX着色器应用到XNA中的旋转纹理

圈在不同的旋转(不按顺序,但弧度值标记):http://imgur.com/a/Preth

一切我研究了关于矩阵数学说,我使用了旋转正确的公式,但我想也许我做的事情错误。这里是我的.fx shader代码:

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

你到底在想什么?为什么使用旋转的纹理坐标来改变颜色?你不想在新的位置采样纹理吗? – 2013-03-19 09:51:39

+0

是的,基本上,圆是Farseer物理引擎中的一个主体部分,由于运动和被撞击,阴影必须考虑旋转的部分。正如你所看到的,当圆圈在起始位置时,阴影起作用,而左侧较暗。这也适用于我添加动态光源。如果我不考虑旋转,黑暗会随着圆形旋转,这对外部光源不起作用。 – OthelloNYC 2013-03-19 15:56:48

+0

对不起,我耗尽了编辑时间。圆圈在XNA/Farseer中旋转。着色器必须保持左侧的阴影。不考虑旋转似乎会使阴影与圆形一起旋转,所以我需要考虑传递给着色器的旋转以将阴影保留在左侧。我感觉我的旋转算法存在错误,因为我从字面上删除了我为动态照明制作的所有其他计算。 – OthelloNYC 2013-03-19 16:04:36

回答

1

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