OpenGL 从未绑定的纹理单元读取

OpenGL reading from unbound texture unit

OpenGL 标准是否规定了 texture2d 操作的结果应该被赋予程序未绑定到纹理单元的统一采样器 2D?

例如在像素着色器中:

layout(binding=0) uniform sampler2D Map_Diffuse;
...
texture2D(Map_Diffuse, attrib_Fragment_Texture)

程序中的位置:

::glActiveTexture(GL_TEXTURE0); 
::glBindTexture(GL_TEXTURE_2D, 0);

对于上下文,我想知道我是否可以对纹理和非纹理实体使用相同的着色器,其中(希望如此)我只需要确保没有任何东西绑定到 GL_TEXTURE_2D for texture2d() 到return 0, 0, 0, 1。否则我需要为每个排列使用一个着色器。

Does the OpenGL standard mandate what the result of a texture2d operation should be given a uniform sampler2D that the program hasn't bound to a texture unit?

当纹理采样器未绑定到纹理对象时,它默认绑定到纹理对象 0/null,这类似于 C/C++ 中的 null。根据我的经验,当访问对象 null 时,您会得到零值 例如:

 vec2 Data = texture(unboundSampler, textureCoords); 

Data 通常是 zoroes,但我的假设是这个实现依赖,一些驱动程序可能会崩溃。

For context I'm wondering whether I can use the same shader for textured and non-textured entities

在我的引擎中,我通过创建 4 个白色像素的默认白色纹理解决了这个问题。在引擎初始化时由代码生成。当我想使用具有纹理采样器的着色器并且相应的 material 没有纹理时,我分配了默认的白色纹理。这样我就可以重复使用相同的着色器。如果您非常关心性能,您可能希望为非纹理对象使用没有纹理的着色器。

standard doesn't talk about the implementation but it encourages you to think about the zero object as non-functional object. https://www.opengl.org/wiki/OpenGL_Object#Object_zero

我阅读规范的方式保证 return 黑色。以下引用是从 3.3 规范中复制的。

第 2.11.7 "Shader Execution" 节 "Vertex Shaders",第 81 页:

Using a sampler in a vertex or geometry shader will return (R,G,B,A) = (0,0,0,1) if the sampler’s associated texture is not complete, as defined in section 3.8.14.

和第 3.9.2 节 "Shader Execution" 下的 "Fragment Shaders" 中的等效内容,第 188 页:

Using a sampler in a fragment shader will return (R,G,B,A) = (0,0,0,1) if the sampler’s associated texture is not complete, as defined in section 3.8.14.

在第 3.8.14 节 "Texture Completeness" 中,它说:

A texture is said to be complete if all the image arrays and texture parameters required to utilize the texture for texture application are consistently defined.

现在,它没有明确说明甚至不存在的纹理对象。但是由于不引用纹理对象(包括 0)的纹理名称肯定没有 "all the image arrays and texture parameters consistently defined",我认为它们属于上述定义中的 "not complete"。