2

是否可以确定采样器是否实际附加到纹理单元而不是简单地未设置?

sampler2D mySampler : register(S0);
...
if(mySampler == 0)
  value = const_value;
else
  value = tex2D(mySampler, uv);

这是针对 WPF 效果 (PS 3.0) 的,如果这有什么不同的话。

4

1 回答 1

1

Afaik 没有直接的方法来检查这一点。在我的经验中,未初始化的着色器常量可能表现得非常奇怪,例如,一个系统用未初始化的纹理绘制了我的场景,因为 tex2D 只返回黑色。但在另一个系统上,整个场景看起来很糟糕,因为它返回的值不是 0。

所以你必须从你的其他代码中处理这种情况。或者带有一个由你自己设置的全局变量:

bool mySamplerisset;
sampler2D mySampler : register(S0);
... 
if (mySamplerisset)
  value = tex2D(mySampler, uv);
else
  value = const_value;

或者为了获得最大性能,避免分支,使用预处理器指令,所以你编译你的着色器的两个版本(一次使用#define,一次不使用)并使用适当的:

#define SAMPLERISSET
sampler2D mySampler : register(S0);
... 
#if defined(SAMPLERISSET)
  value = tex2D(mySampler, uv);
#elseif
  value = const_value;
#endif
于 2012-10-05T09:31:16.197 回答