OpenGL4.5 - 绑定多个纹理和采样器

2024-03-24

我试图了解 OpenGL 4.5 中的纹理、纹理单元和采样器。我附上一张我想弄清楚的图片。我认为在我的示例中一切都是正确的,但我不太确定右侧带有问号的 1D 采样器。

所以,我知道 OpenGL 提供了许多纹理单元/绑定点,可以在其中绑定纹理和采样器,以便它们协同工作。

这些绑定点中的每一个都可以支持每个纹理目标之一(在我的情况下,我正在绑定目标GL_TEXTURE_2D and GL_TEXTURE_1D到绑定点0,还有另一个GL_TEXTURE_2D到绑定点1).

此外,采样器可以以大致相同的方式绑定到这些绑定点(我已将 2D 采样器绑定到绑定点)0在图中)。

执行这些操作的函数是glBindTextureUnit and glBindSampler.

我最初的想法是将 1D 采样器也绑定到绑定点 0,并在着色器区域中根据绑定点和采样器类型进行匹配:

layout (binding = 0) uniform sampler1D tex1D;
layout (binding = 0) uniform sampler2D tex2D;

引用来源:

每个纹理图像单元支持绑定到所有目标。所以一个 2D 纹理和数组纹理可以绑定到同一个图像单元, 或者 不同的 2D 纹理可以绑定在两个不同的图像单元中 互不影响。那么什么时候使用哪个纹理 渲染?在 GLSL 中,这取决于使用它的采样器类型 纹理图像单元。

但我发现以下声明:

[..] 听起来很可疑,你可以使用相同的纹理图像单元 对于不同的采样器,只要它们具有不同的纹理类型即可。 不要这样做。规范明确不允许这样做;如果两个不同 GLSL 采样器具有不同的纹理类型,但与 相同的纹理图像单元,则渲染将失败。给每个 采样器不同的纹理图像单元。

所以,我的问题是,将不同的纹理目标绑定到同一个绑定点的目的是什么,如果最终是single采样器将被绑定到该绑定点,迫使您做出选择?

我引用的信息:https://www.khronos.org/opengl/wiki/Texture#Texture_image_units https://www.khronos.org/opengl/wiki/Texture#Texture_image_units


那么为什么会存在这种情况呢?出色地...

曾几何时,没有纹理单元(这就是为什么glActiveTexture是一个独立的函数glBindTexture)。确实,连纹理都没有objects在 OpenGL 1.0 中。但仍然需要有不同种类的纹理。您仍然需要能够为 2D 纹理和 3D 纹理创建数据。所以他们想出了纹理目标的区别,并且他们使用了glEnables 来确定渲染操作中将使用哪个目标。

当纹理对象在 GL 1.1 中出现时,他们必须决定纹理对象和目标之间的关系。他们决定,一旦一个对象绑定到一个目标,它就永久地与该目标关联。由于上述需要具有不同类型的多个纹理,并且使用旧的启用功能,因此决定每个目标代表一个单独的对象绑定点。他们让你重复绑定点glBindTexture,这样代码的读者就可以清楚地知道您正在干扰哪个绑定点的数据。

当多重纹理出现时,切换到 OpenGL 1.2。所以现在他们需要您能够将同一目标的多个纹理绑定到不同的“单元”。但他们却无法改变glBindTexture指定特定单位;这将是一个向后不兼容的更改。

现在,他们可以彻底改变纹理的工作方式,专门为多重纹理等创建新的绑定函数。但 OpenGL ARB 喜欢向后兼容;他们喜欢让旧的 API 函数发挥作用,无论最终的 API 是什么样子。因此,他们决定纹理单元将是一个完整的set绑定,每组都有一个启用状态,说明要使用哪个目标。然后你可以在单位之间切换glActiveTexture.

当然,一旦着色器出现,您就可以看到这一切发生了怎样的变化。启用状态成为着色器中的采样器类型。所以现在没有明确的代码来描述启用哪个纹理目标;这只是着色器的东西。因此,他们必须制定一条规则,规定两个采样器如果类型不同,则不能使用相同的单元。

这就是为什么每个纹理单元都有多个独立的绑定点:OpenGL 对向后兼容性的承诺。

最好忽略这种能力的存在。绑定您的特定着色器需要的正确纹理。因此,请专注于使用这些函数,不要担心可能有两个纹理绑定到同一目标。如果您想确保没有意外使用错误的纹理,可以使用glBindTextures or glBindTextureUnit纹理名称为 0,这将取消绑定特定纹理单元中的所有目标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL4.5 - 绑定多个纹理和采样器 的相关文章

随机推荐

  • 最低限度的文本清理

    在接受 存储 处理和显示 Unicode 文本的应用程序中 为了讨论的目的 我们假设它是一个 Web 应用程序 哪些字符应该always从传入文本中删除 我能想到一些 大部分列在C0 和 C1 控制代码维基百科文章 http en wiki
  • 从命令行执行Java

    我的桌面上有一个名为 Stuff 的文件夹 在该文件夹中我有以下内容 你好 java mail jar 而Hello java是从mail jar导入的 所以我需要告诉Hello java寻找mail jar 从 Windows 命令行和
  • 仅使用 Dockerfile 中的其他更改重建相同的 docker 映像

    我使用 Dockerfile 构建 Docker 映像 构建镜像后 我对 Dockerfile 进行了一些基本更改 是否可以仅通过额外的更改来重建相同的映像 由于创建图像需要很长时间 因此我不想完全构建它 提前致谢 所有 docker 构建
  • 设置私有 luarocks 存储库

    对于我的设置 我需要一个 luarocks rock 的私有存储库 我可以将它们安装在我的开发环境中 而无需连接到互联网 为 luarocks 设置远程存储库的步骤是什么 我可以使用 sftp 服务器吗 有人有过这样的经历吗 在深入研究这个
  • C++:类成员引用有效性?

    Class A A int foo m foo foo int m foo int main void A bar 0 int var 5 bar new A var std cout lt lt Is m foo still valid
  • Python中按多个条件排序

    我正在使用Python 3 8 我试图按分数对玩家进行排序 按降序排列 然后 只有当他们具有相同的分数时 才按排名排序 我已经读过排序方法 https docs python org 3 8 howto sorting html Pytho
  • 从其他服务器下载之前是否可以动态压缩文件?

    我想知道是否可以编写浏览器扩展或简单的 Java 脚本代码 其中包含指向不同位置的 URL 列表 可以将所有内容压缩在一起 我是说 例如 有 3 个不同的图像文件 http example1 com a png http example1
  • D3 在将 .data() 设置为附加元素时抛出“无法读取 null 的属性‘ownerDocument’”

    我收到此错误 未捕获的类型错误 无法读取 null 的属性 ownerDocument 这是来自设置的行 data 到最近附加的元素d3 const someSet someSelection filter some filter some
  • ios 延迟位置更新的问题

    过去两天我一直在尝试在应用程序中实现延迟位置更新 我面临的问题是 void locationManager CLLocationManager manager didUpdateLocations NSArray locations 即使在
  • 如何编写使用 Django 模块的独立 Python 脚本?

    在 PyCharm 中 我创建了一个空白的新 Django 应用程序 创建了一些模型并发布manage py makemigrations and manage py migrate 我尝试编写一个独立的脚本 用初始数据填充数据库 在其导入
  • keras mnist.load_data() 速度超慢,一段时间后会抛出错误

    这是我使用的完整代码 import os import numpy as np import matplotlib pyplot as plt from tqdm import tqdm from keras layers import I
  • 在 Windows 上更改 apache 的文档根不起作用

    我正在尝试更改本地 Windows 计算机上的 documentroot 以指向 htdocs 下面的子目录 我已经更改了 httpd conf 中的 DocumentRoot 位置以及目录位置 我已经重新启动了 Apache 但用 PHP
  • 为什么十六进制数会自动转换为十进制数?

    我正在开发一个Python小方法 它需要从另一个文件中读取代表键和值的字典 但我似乎遇到了我发送的数值表示的问题 例如 我的字典中的某些键如下所示 id dict val a 0x0000 val b 0x1000 但我注意到 当我尝试遍历
  • 如果目录不存在则创建

    我正在编写一个 PowerShell 脚本来创建多个目录 如果它们不存在 文件系统看起来与此类似 D D TopDirec SubDirec Project1 Revision1 Reports D TopDirec SubDirec Pr
  • @GenerateValue 和 @GenericGenerator 之间的区别

    有时我发现他们在一起 有时单独 其他时候他们似乎也做同样的事情 有什么不同 以下是三个例子 他们的做法有何不同 为什么我不能对所有这些都使用 GenerateValue 实施例1 Id GeneratedValue generator in
  • VueJS CKeditor5上传图片

    在 Vuejs 中使用 CKeditor5 上传图像时遇到问题 第一次尝试过简单上传适配器 https ckeditor com docs ckeditor5 latest features image upload simple uplo
  • Fluent NHibernate 主键约束命名约定

    有没有办法在 Fluent NHibernate 中为我的主键约束创建命名约定 我知道您可以命名外键约束 但似乎不可能命名主键约束 FNH 的 James Gregory 说 不 NHibernate 不支持这一点 因此我们也无法支持它 h
  • 有没有办法将自定义颜色存储在文件中并从 iOS 中的代码访问它们?

    我是一个 iOS 新手 但我有一些 Android 编程经验 我记得在 Android 中你可以在一个文件中定义一组自定义颜色颜色 xml您可以在代码中使用该文件 因此 每次必须在某处应用新颜色时 无需以编程方式定义新颜色 我的问题是 iO
  • 如何序列化List

    我有A班 B班和C班是A班的一部分 Class A Few Properties of Class A List
  • OpenGL4.5 - 绑定多个纹理和采样器

    我试图了解 OpenGL 4 5 中的纹理 纹理单元和采样器 我附上一张我想弄清楚的图片 我认为在我的示例中一切都是正确的 但我不太确定右侧带有问号的 1D 采样器 所以 我知道 OpenGL 提供了许多纹理单元 绑定点 可以在其中绑定纹理