如何检查glsl中的采样器是否为空?

时间:2014-07-19 14:49:24

标签: opengl glsl

我有一个带有_color制服和采样器的着色器。现在我只想在没有设置采样器的情况下使用_color进行绘制。有没有办法在着色器中找出我们的内容? (不幸的是,当未分配时,采样器返回1,1,1,1,这使得通过alpha混合它是不可能的)

3 个答案:

答案 0 :(得分:7)

你做不到。采样器是一个不透明的手柄,它只引用一个纹理单元。我不确定规范是否保证(1,1,1,1)从没有纹理绑定的单元采样时,或者是否是未定义的行为。

你可以做的只是使用另一个制服来使用采样器或均匀颜色切换,或者只使用不同的着色器并在它们之间切换。这里也存在子程序的可能性,但我不知道这对于这样一个简单的问题是否是正确的方法。

答案 1 :(得分:2)

我偶然发现了这个试图解决类似问题的问题。

自GLSL 4.30

int textureQueryLevels( gsamplerX sampler);

是内置功能。在GLSL规范中。页。 151它说

  

如果没有纹理或不完整的纹理与采样器相关联,则返回零值。

在OpenGL-Forms中,我找到了这个问题的条目,建议使用

ivecY textureSize(gsamplerX sampler,int lod);

并测试纹理大小是否大于零。但据我的理解,这不是标准所涵盖的。在OpenGL规范的11.1.3.4节中,据说

  

如果计算出的纹理图像等级超出[levelbase,q]范围,则​​结果未定义......

编辑: 我刚刚在我的问题上尝试了这个方法,因为事实证明nvidia在这个函数中有一些问题,当没有绑定纹理时会导致非零值。 (见2015年nvidia bug report

答案 2 :(得分:-1)

sampler2d影响x y和z,因此如果检查参数w为第四参数的对象,则可以检查u是否提供纹理

vec4 texturecolor ;
texturecolor=texture2D(sampler, uv)*vec4(color,1.0);
if( texturecolor == vec4(0,0,0,1))
{
     texturecolor = vec4(color,1.0);
}