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