D3D 输入槽到底是什么以及 OpenGL 的等效项是什么?

sou*_*mik 2 opengl direct3d

D3D11_INPUT_ELEMENT_DESC在 Direct3D 中,当我们使用和 调用指定顶点着色器的输入时IASetVertexBuffers,我们必须指定“输入槽”。这些输入槽到底是什么?OpenGL 等效项是什么?这些输入槽似乎与layout(location = K)GLSL 中指定的“位置”和glVertexAttribPointer.

Nic*_*las 5

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

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

OpenGL 4.3/ARB_separate_attrib_format提供了与和类似的概念。前者指定顶点数据去往哪个属性位置。后者指定哪个缓冲区绑定索引将提供该属性。缓冲区绑定到带有 的缓冲区绑定索引。glVertexAttribFormatglVertexAttribBindingglBindVertexBuffer(s)

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