D3D输入插槽到底是什么以及OpenGL等价物是什么?

时间:2017-05-27 12:39:38

标签: opengl direct3d

在Direct3D中,当我们使用my_list = ["a", "d", "c", "b"] my_list_rdd = sc.parallelize(my_list) sc.broadcast(my_list_rdd.collect) // <-- collect the dataset 指定顶点着色器的输入时,当我们调用D3D11_INPUT_ELEMENT_DESC时,我们必须指定输入插槽&#39;。这些输入插槽到底是什么,以及OpenGL的等价物是什么?这些输入插槽似乎与“&#39;位置”相同。通过GLSL中的IASetVertexBuffers指定,并layout(location = K)的第一个参数。

1 个答案:

答案 0 :(得分:2)

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

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

OpenGL 4.3/ARB_separate_attrib_format通过glVertexAttribFormatglVertexAttribBinding提供similar concepts。前者指定顶点数据所属的属性位置。后者指定哪个缓冲区绑定索引将提供该属性。缓冲区必须使用glBindVertexBuffer(s)缓冲绑定索引。

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