【问题标题】:Basic pixel shader in XNA : incomprehensible bug with two texturesXNA 中的基本像素着色器:带有两个纹理的难以理解的错误
【发布时间】:2013-06-25 21:21:20
【问题描述】:

所以我是着色器的新手(使用 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) 可能),但我真的很想知道是什么原因造成的!

如果您需要有关我的代码的更多详细信息,请告诉我。

【问题讨论】:

  • 一个疯狂的猜测:也许着色器编译器(这里和那里有一些错误)正在优化 s0,因为它从未使用过,错误地将 s1 向下移动。
  • 哦……也许吧。那是一些过分热心的优化!

标签: xna shader


【解决方案1】:

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

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

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

对于低像素着色器版本,使用 t1、t2、t3...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多