- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试了解 OpenGL 4.5 中的纹理、纹理单元和采样器。我附上了一张我想弄清楚的照片。我认为在我的示例中一切都是正确的,但我不太确定右侧带有问号的一维采样器。
所以,我知道 OpenGL 提供了许多纹理单元/绑定(bind)点,纹理和采样器可以在其中绑定(bind),以便它们一起工作。
这些绑定(bind)点中的每一个都可以支持每个纹理目标之一(在我的例子中,我将目标 GL_TEXTURE_2D
和 GL_TEXTURE_1D
绑定(bind)到绑定(bind)点 0
,另一个 GL_TEXTURE_2D
到绑定(bind)点 1
)。
此外,采样器可以以几乎相同的方式绑定(bind)到这些绑定(bind)点(我已将 2D 采样器绑定(bind)到图片中的绑定(bind)点 0
)。
执行这些操作的函数是 glBindTextureUnit
和 glBindSampler
。
我最初的想法是将 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 的 glBindTextures
或 glBindTextureUnit
,这将解除绑定(bind)中的所有目标特定的纹理单元。
关于c++ - OpenGL4.5 - 绑定(bind)多个纹理和采样器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233643/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!