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

使用具有多个采样器均匀的单个纹理图像单元

孟韬
2023-03-14

我正在编写一个批处理系统,它跟踪当前绑定的纹理,以避免不必要的glBindTexture()调用。我不确定是否需要跟踪特定批次已经使用了哪些纹理,因此如果一个纹理被使用两次,它将被绑定到需要它的第二个采样器的不同TIU。

OpenGL应用程序是否可以在同一着色器阶段内对多个采样器使用相同的纹理图像单元?不同着色器阶段的采样器如何?例如:

片段着色器:

...
uniform sampler2D samp1;
uniform sampler2D samp2;

void main() { ... }

主要节目:

...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id);
glUniform1i(samp1_location, 0);
glUniform1i(samp2_location, 0);
...

我看不出这不起作用的任何原因,但是如果着色器程序也包括这样的顶点着色器呢:

顶点着色器:

...
uniform sampler2D samp1;

void main() { ... }

在这种情况下,OpenGL应该将samp1的两个实例视为引用相同的位置。因此,顶点和片段着色器中使用了相同的纹理单元。我读过在两个不同的着色器阶段使用相同的纹理对GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS的影响加倍,但这似乎与此相矛盾。

在我的硬件(HD6870)的快速测试中,以下所有场景都按预期工作:

  • 1 TIU用于同一着色器阶段的2个采样器制服
  • 1个TIU用于1个采样器均匀,用于2个着色器阶段
  • 1个TIU用于2个采样器制服,每个都发生在不同的阶段。

但是,我不知道这是否是我应该在所有硬件/驱动程序上期望的行为,或者是否存在性能影响。

共有1个答案

宋飞掣
2023-03-14

希望这能消除你的一些困惑,我使用了旧版本的规范。为了简单起见,新版本有两个额外的阶段(镶嵌控制/评估),所以讨论稍微复杂一点。

纹理访问

着色器能够对纹理映射进行查找。顶点、几何或片段着色器可用的最大纹理图像单元数分别是与实现相关的常量GL_MAX_VERTEX_TEXTURE_IMAGE_UNITSGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITSGL_MAX_TEXTURE_IMAGE_UNITS的值。顶点着色器、几何着色器和片段着色器组合使用的纹理图像单元不能超过GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS的值。如果顶点着色器、几何着色器和片段处理阶段中有多个访问相同的纹理图像单元,则每个此类访问都根据GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS限制单独计数。

该限制是根据每个阶段使用的独特采样器的数量施加的。就使用确定而言,两种取样器制服的名称不同,但引用相同的纹理单元,实际上是相同的。用法指的是做一些像纹理(sampler,coords),如果这还不明显的话。仅仅声明一个采样器并为其分配一个值并不会使您更接近实现定义的限制,实际上您必须在运行时使用该采样器,如果它与同一阶段中使用的另一个采样器具有相同的值,则不计算在内。

至于多次使用同一个纹理对象,这不是_图像单位limit就是这样。如果需要,可以将同一纹理绑定到所有48个纹理单元(GL3.3中的最低实现要求-这实际上要求每个阶段至少16个纹理),该限制是指在着色器阶段中使用的不同采样器的数量(同样,请参见上文)。如果需要将同一纹理绑定到多个纹理单元,则可能需要将其与最近邻过滤一起使用一次,与线性或不同的包裹状态一起使用另一次。

如果您想知道所有驱动程序/硬件上的预期行为,请务必参考正式的OpenGL规范。我为你挑选了相关的信息,但你最好学会如何在未来搜索重要的细节。自OpenGL 1.0以来的所有规范均可从以下网站免费获取:http://www.opengl.org/registry/.

 类似资料:
  • 使用OpenGL(核心配置文件,4.4),将同一个采样器对象同时绑定到2个不同的纹理单元是否“合法”? 我的测试表明它是有效的,但我不知道我的司机是否原谅了我,或者这是一项功能。

  • 在openGL中,可以将一个纹理绑定到两个(或多个)不同的统一采样器吗?使用两种不同的纹理进行渲染时,如下所示: 着色器: 客户: 但当我尝试将一个纹理对象绑定到两个不同的纹理单元时,似乎第一个绑定的单元保持未绑定状态: 当然,可以为两个采样器设置相同的单位,但有时我还想为不同的纹理使用着色器,而不仅仅是为两个采样器设置相同的纹理对象。 这个解决方案实际上运行得很好,但它不符合我所描述的需求。也可

  • 如何为一个纹理阵列创建多个采样器 到目前为止,我一直依赖OpenGL来确定声明的sampler是指我与绑定的纹理数组。 我尝试在片段着色器中指定两个采样器,但片段着色器出现编译错误: 我没想到这会起作用,但是,我不确定片段着色器编译器是否检查采样器是否分配了纹理,所以可能是其他问题。 我尝试生成和绑定采样器对象,但我仍然得到一个片段着色器错误: 我想坚持使用OpenGL的较低版本,有可能吗?非常感

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

  • 我试图理解OpenGL 4.5中的纹理、纹理单位和采样器。我在附上一张我想弄明白的照片。我认为在我的例子中,一切都是正确的,但我不太确定右侧带有问号的1D采样器。 因此,我知道OpenGL提供了许多纹理单元/绑定点,可以在其中绑定纹理和采样器,以便它们协同工作。 这些绑定点中的每一个都可以支持每个纹理目标中的一个(在我的例子中,我将目标和绑定到绑定点,另一个绑定点)。 此外,采样器可以以大致相同的

  • 我需要在着色器中使用两个纹理,一个在顶点着色器中,另一个在片段着色器中。在这两种情况下,它们都在着色器中引用,例如