D3D Input Slots 究竟是什么,OpenGL 的等价物是什么?

What exactly are D3D Input Slots and what is the OpenGL equivalent?

在 Direct3D 中,当我们使用 D3D11_INPUT_ELEMENT_DESC 指定顶点着色器的输入时,当我们调用 IASetVertexBuffers 时,我们必须指定 'the input slot(s)'。这些输入槽到底是什么,OpenGL 等价物是什么?这些输入槽似乎与 GLSL 中通过 layout(location = K) 指定的 'locations' 和 glVertexAttribPointer.

的第一个参数不同

顶点输入来自存储在缓冲区中的值数组。 SemanticIndex 标识输入在着色器中的位置。 InputSlot 定义哪个 缓冲区 为该属性提供数据。缓冲区不受语义索引的约束;他们必须输入插槽。

看,D3D 有两个数组:语义数组(匹配着色器中定义的语义)和输入槽数组。您使用的每个语义都有一个 INPUT_DESC 结构,它指定(除其他事项外)从语义到提供它的输入槽的映射。顶点缓冲区绑定到输入槽。使用这些插槽的任何输入都将从同一缓冲区中提取数据。一个特定的输入可以有一个关于如何访问它的顶点数据的偏移量;这允许交错顶点数据。

OpenGL 4.3/ARB_separate_attrib_format provides glVertexAttribFormatglVertexAttribBinding。前者指定顶点数据到什么属性位置。后者指定哪个缓冲区绑定索引将提供该属性。缓冲区绑定到 glBindVertexBuffer(s).

的缓冲区绑定索引

使用较旧的 glBindBuffer(GL_ARRAY_BUFFER)/glVertexAttribPointer APIs 时,缓冲区绑定索引和属性位置索引实际上是相同的。但这是一个糟糕的 API 如果您不必支持旧的 GL 版本,我建议您使用更新的东西。