无纹理绑定的OpenGL采样

无纹理绑定的OpenGL采样,opengl,opengl-es,Opengl,Opengl Es,在GLSL中采样纹理时,如下所示: vec4 color = texture(mySampler, myCoords); 若并没有纹理绑定到mySampler,那个么颜色似乎总是(0,0,0,1) 这是标准行为吗?或者在某些实现中它可能未定义?我在规格中找不到任何东西。实际上没有“未绑定”这样的东西——您只需绑定到初始纹理对象,称为纹理0。根据OpenGL wiki() 最终,您将在着色器中获得的值取决于当时纹理对象0中发生的情况。我真的找不到任何东西,除了一个真正说明这应该是什么的: The

在GLSL中采样纹理时,如下所示:

vec4 color = texture(mySampler, myCoords);
若并没有纹理绑定到mySampler,那个么颜色似乎总是(0,0,0,1)


这是标准行为吗?或者在某些实现中它可能未定义?我在规格中找不到任何东西。

实际上没有“未绑定”这样的东西——您只需绑定到初始纹理对象,称为纹理0。根据OpenGL wiki()

最终,您将在着色器中获得的值取决于当时纹理对象0中发生的情况。我真的找不到任何东西,除了一个真正说明这应该是什么的:

The texture 0 represents an actual texture object, the default texture.
All textures start out as 1x1 white textures.
我当然不相信,要在所有GPU驱动程序中保持一致,您的GPU驱动程序可能会将其初始化为全部零,或者它可能被视为不完整的纹理,在这种情况下,OpenGL规范(至少2.0及更高版本)会说:

。。。因此,最明智的做法似乎是“不要那样做”。如果你要运行采样器,请确保你有一个有效的(非零id)纹理绑定。

Nathan是正确的(但我太新/声誉太低,无法提升投票)

我已经/肯定/看到,在一些OpenGL ES平台上,使用未绑定纹理会在屏幕上渲染垃圾(图形内存的随机内容)。您不能相信所有驱动程序供应商都会遵守规范


永远不要引用未绑定的OpenGL对象或状态。

请参阅。我在规范中也找不到任何东西,但据我所知,它还没有定义。我当然见过它在不同的实现中做不同的事情!事实上,我只测试了一个vec3(它是(0,0,0)),所以也许最后一个组件实际上是1。我会更喜欢引用实际规范,而不是opengl.org的wiki,但这比我自己发现的更好。谢谢。@JeremyLaumon是的,我查看了规范,但找不到:(也许其他人能找到。)OpenGL规范(至少2.0及更高版本)说:“仅供参考:该语言在4.5中进行了修订和更新。您只得到(0,0,0,1)浮点采样器为0,阴影采样器为0。整数采样器的值未定义。还需要注意的是,OpenGL和OpenGL ES是不同的规范,可能有不同的行为。如果ES严格未定义,我不会感到惊讶。
The texture 0 represents an actual texture object, the default texture.
All textures start out as 1x1 white textures.
If a fragment shader uses a sampler whose associated texture object is not
complete, the texture image unit will return (R, G, B, A) = (0, 0, 0, 1).