是否可以确定采样器是否实际附加到纹理单元而不是简单地未设置?
sampler2D mySampler : register(S0);
...
if(mySampler == 0)
value = const_value;
else
value = tex2D(mySampler, uv);
这是针对 WPF 效果 (PS 3.0) 的,如果这有什么不同的话。
是否可以确定采样器是否实际附加到纹理单元而不是简单地未设置?
sampler2D mySampler : register(S0);
...
if(mySampler == 0)
value = const_value;
else
value = tex2D(mySampler, uv);
这是针对 WPF 效果 (PS 3.0) 的,如果这有什么不同的话。
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