2013-02-23 33 views
1

所以我新的着色器(使用XNA),和我收到我无法解释一个超级怪异的错误。考虑下面的像素着色器功能:基本像素着色器:难以理解的错误有两个纹理

float4 BasicTest(float2 coords: TEXCOORD0) : COLOR0 
{ 
float4 src=tex2D(s0, coords); 
float4 dst=tex2D(s1, coords); 
float4 color=src; 
if (coords.x>0.5) color=dst; 
return color; 
} 

这显示纹理src在屏幕的左侧,dst在右侧,符合市场预期。不过,如果我不是简单地使用:

float4 BasicTest(float2 coords: TEXCOORD0) : COLOR0 
{ 
float4 src=tex2D(s0, coords); 
float4 dst=tex2D(s1, coords); 
float4 color=dst; 
return color; 
} 

我得到src在整个屏幕上!

显然,着色器根本不会显示dst,除非它在某种表达式中(color=src*0.5+dst*0.5也可以正常工作)。我想我可以围绕这个问题(if (coords.x>=0)也许)欺骗,但我真的宁愿知道是什么原因引起的!

如果您需要了解我的代码的其他详细信息,请告诉我。

+1

胡乱猜测:也许着色器编译器(在这里和那里都有一些bug)正在优化's0',因为它从未被使用过,错误地向下移动了's1'。 – 2013-02-24 07:04:20

+0

哦...也许。那是一些过分热情的优化! – Orteil 2013-02-24 11:21:16

回答

0

这是一个奇怪的错误确实如此。

如果您使用PS 2.0或更高版本: 注册您的样品是这样的:

sampler tex0: register(s1); 
sampler tex1: register(s2); 

别人更低的像素着色器的版本,使用T1,T2,T3 ...