当前位置: 首页 > 知识库问答 >
问题:

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

乜飞航
2023-03-14

OpenGL标准是否要求应该给一个程序没有绑定到纹理单元的统一采样器2D给出一个texture 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。否则,我需要为每个置换使用一个着色器。

共有2个答案

宇文兴言
2023-03-14

OpenGL标准是否要求应该给一个程序没有绑定到纹理单元的统一采样器2D给出一个texture 2d操作的结果?

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

 vec2 Data = texture(unboundSampler, textureCoords); 

数据通常是zoroes,但我的假设是这取决于实现,一些驱动程序可能会崩溃。

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

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

该标准没有讨论实现,但它鼓励您将零对象视为非功能对象。https://www.opengl.org/wiki/OpenGL_Object#Object_zero

景轶
2023-03-14

按照我看说明书的方式,它肯定会返回黑色。以下引用是从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)的纹理名称肯定没有“一致定义的所有图像数组和纹理参数”,因此我认为它们在上述定义中属于“不完整”。

 类似资料:
  • 我正在尝试将多个纹理绑定到片段着色器中的采样器。加载代码似乎运行良好。ATI的CodeXL显示正确加载的纹理。 但是,当我将模型的纹理绑定到活动纹理0和1时,我无法让它将值发送到我的着色器。当我将着色器统一标记为usampler2D并使用uvec4存储颜色时,就像我应该做的那样,因为我的纹理是以无符号字节提供的,我得到了一个全白色的模型。当我将着色器统一更改为sampler2D并使用vec4存储颜

  • “我在我的申请中发现了一个奇怪的行为,希望你能解释给我听。”。你看,我有两个3D纹理,它们被发送到片段着色器,渲染得非常好。但有一个问题,当我创建另一个纹理(它是1D纹理)时,一个黑屏正在被渲染,而不是正确的前一个结果。 关于这个1D纹理,我甚至没有将其发送到片段着色器。当我调用glTexImage1D(…)时,黑屏就出现了。我评论这句话,它就消失了!!这两种纹理被渲染。 我觉得纹理单位肯定有问题

  • 最近我发现了一个OpenGL示例,它应用纹理而没有指定纹理图像单元并且没有将相应的单元整数均匀发送到着色器中,是否可以在不使用纹理单元的情况下应用纹理??或者它只是为活动纹理单元及其着色器采样器值使用默认值。 我的代码块(纹理相关): 我的片段着色器:

  • 我对如何将纹理绑定到GLSL中的插槽有点困惑。以下是我的着色器: 当我设置矩阵时,我需要查询统一位置,然后手动设置该位置的值,执行如下操作: 然而,据我所知,我不需要这样做来初始化我的纹理采样器。在设置时,我似乎只需要这样做: 所以,我的问题是,为什么我不需要对纹理进行与矩阵相同的处理?OpenGL运行时如何“知道”我绑定的纹理应该是我定义的采样器?如果我想拥有多种纹理,我该怎么做呢?

  • 在我的程序中,我使用了2种纹理:t0和t1。t1是附加的,仅在某些情况下需要: 绘图着色器: 它的工作原理很好:第二个纹理在需要时首先重叠。假设使用glBindTexture(..,0)返回零纹理(0,0,0,0),但在将NVidia驱动程序更新到314.07后,我的代码会出现黑屏,比如glBindTexture(..,0)返回(0,0,0,1)纹理。 我做了一些测试:使用着色器 我在旧驱动程序(

  • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理