gpt4 book ai didi

c++ - OpenGL4.5 - 绑定(bind)多个纹理和采样器

转载 作者:可可西里 更新时间:2023-11-01 15:22:17 24 4
gpt4 key购买 nike

enter image description here

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

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

这些绑定(bind)点中的每一个都可以支持每个纹理目标之一(在我的例子中,我将目标 GL_TEXTURE_2DGL_TEXTURE_1D 绑定(bind)到绑定(bind)点 0,另一个 GL_TEXTURE_2D 到绑定(bind)点 1)。

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

执行这些操作的函数是 glBindTextureUnitglBindSampler

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

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

引用来源:

Each texture image unit supports bindings to all targets. So a 2D texture and an array texture can be bound to the same image unit, or different 2D textures can be bound in two different image units without affecting each other. So which texture gets used when rendering? In GLSL, this depends on the type of sampler that uses this texture image unit.

但是我发现了如下语句:

[..] sounds suspiciously like you can use the same texture image unit for different samplers, as long as they have different texture types. Do not do this. The spec explicitly disallows it; if two different GLSL samplers have different texture types, but are associated with the same texture image unit, then rendering will fail. Give each sampler a different texture image unit.

所以,我的问题是,如果最终要将一个单个采样器绑定(bind)到那个绑定(bind)点,那么将不同的纹理目标绑定(bind)到同一个绑定(bind)点的目的是什么,迫使你选择?

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

最佳答案

那么为什么会存在呢?嗯……

曾几何时,没有纹理单元(这就是为什么 glActiveTexture 是一个独立于 glBindTexture 的函数)。事实上,在 OpenGL 1.0 中甚至没有纹理对象。但是仍然需要有不同种类的纹理。您仍然需要能够为 2D 纹理和 3D 纹理创建数据。因此,他们提出了纹理目标区分,并使用 glEnable 来确定将在渲染操作中使用哪个目标。

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

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

现在,他们本可以彻底改进纹理的工作方式,创建专门用于多纹理等的新绑定(bind)函数。但是 OpenGL ARB 喜欢向后兼容;他们喜欢让旧的 API 函数正常工作,不管生成的 API 是什么样子。因此,他们决定一个纹理单元将是一整套 绑定(bind),每组都有一个启用状态,说明要使用哪个目标。您可以使用 glActiveTexture 在单位之间切换。

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

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

最好忽略此功能的存在。绑定(bind)您的特定着色器需要的正确纹理。所以专注于使用这些功能,不要担心您可能将两个纹理绑定(bind)到同一个目标。如果你想确定你没有不小心使用了错误的纹理,你可以使用纹理名称为 0 的 glBindTexturesglBindTextureUnit,这将解除绑定(bind)中的所有目标特定的纹理单元。

关于c++ - OpenGL4.5 - 绑定(bind)多个纹理和采样器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com