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

从未绑定的纹理单元读取OpenGL,opengl,textures,shader,Opengl,Textures,Shader,OpenGL标准是否规定了texture2d操作的结果应该是一个统一的sampler2D,程序没有绑定到纹理单元 例如,在像素着色器中: layout(binding=0) uniform sampler2D Map_Diffuse; ... texture2D(Map_Diffuse, attrib_Fragment_Texture) 计划中的位置: ::glActiveTexture(GL_TEXTURE0); ::glBindTexture(GL_TEXTURE_2D, 0); 对于

OpenGL标准是否规定了texture2d操作的结果应该是一个统一的sampler2D,程序没有绑定到纹理单元

例如,在像素着色器中:

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()以返回0,0,0,1。否则,我需要为每个置换使用一个着色器

OpenGL标准规定了纹理2D的结果是什么吗 应该给操作一个程序没有的统一的取样器 绑定到纹理单元

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

 vec2 Data = texture(unboundSampler, textureCoords); 
数据
通常是zoroes,但我的假设是这取决于实现,一些驱动程序可能会崩溃

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

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


但它鼓励您将零对象视为非函数对象

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

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

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

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

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

第3.8.14节“纹理完整性”中指出:

如果使用纹理进行纹理应用所需的所有图像阵列和纹理参数一致定义,则称纹理为完整纹理


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

这是个好主意,虽然我经常喜欢事情发生可怕的崩溃,如果他们试图做一些他们不应该做的事情。我讨厌驱动程序和库对错误的输入非常健壮。他们对程序员没有任何帮助。你知道我的意思吗?“我仍然想知道标准中是否有关于它的内容。”罗宾逊编辑了答案以澄清。可能是重复的是。谢谢你。回答了我的问题!