【问题标题】:OpenGL reading from unbound texture unitOpenGL 从未绑定的纹理单元读取
【发布时间】:2015-04-09 07:20:06
【问题描述】:

OpenGL 标准是否规定应该为程序未绑定到纹理单元的统一 sampler2D 提供纹理 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 以让 texture2d() 返回 0、0、0 , 1. 否则,每个排列都需要一个着色器。

【问题讨论】:

标签: opengl textures shader


【解决方案1】:

按照我阅读规范的方式,它保证返回黑色。以下引号是从 3.3 规范中复制而来的。

在第 81 页的“顶点着色器”下的第 2.11.7 节“着色器执行”中:

如果采样器的关联纹理不完整,则在顶点或几何着色器中使用采样器将返回 (R,G,B,A) = (0,0,0,1),如第 3.8.14 节中所定义。

以及第 188 页“片段着色器”下的第 3.9.2 节“着色器执行”中的等效项:

如果采样器的关联纹理不完整,则在片段着色器中使用采样器将返回 (R,G,B,A) = (0,0,0,1),如第 3.8.14 节中所定义。

在第 3.8.14 节“纹理完整性”中,它说:

如果使用纹理应用纹理所需的所有图像数组和纹理参数都一致定义,则称纹理是完整的。

现在,它没有明确说明甚至不存在的纹理对象。但是由于不引用纹理对象(包括 0)的纹理名称肯定没有“一致定义的所有图像数组和纹理参数”,我认为它们属于上述定义中的“不完整”。

【讨论】:

    【解决方案2】:

    OpenGL 标准是否规定 texture2d 的结果是什么? 操作应该被赋予程序没有的统一的 sampler2D 绑定到纹理单元?

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

     vec2 Data = texture(unboundSampler, textureCoords); 
    

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

    对于上下文,我想知道是否可以使用相同的着色器 纹理和非纹理实体

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

    standard doesn't talk about the implementation 但它鼓励您将零对象视为非功能对象。 https://www.opengl.org/wiki/OpenGL_Object#Object_zero

    【讨论】:

    • 这是一个好主意,但我通常更喜欢如果他们尝试做他们不应该做的事情,事情会发生可怕的崩溃。当驱动程序和库对错误的输入具有鲁棒性时,我讨厌它。他们对程序员没有任何好处。你懂我的意思吗?我仍然想知道标准是否对此有任何说明。
    • @Robinson 编辑了答案以澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2011-07-13
    • 2015-02-26
    相关资源
    最近更新 更多