2017-05-27 59 views
0

在Direct3D,當我們使用D3D11_INPUT_ELEMENT_DESC指定輸入到頂點着色器和當我們調用IASetVertexBuffers,我們必須指定「輸入插槽(秒)」。這些輸入插槽究竟是什麼,以及什麼是OpenGL等價物?這些輸入插槽似乎與GLSL中的layout(location = K)指定的「位置」和glVertexAttribPointer的第一個參數不同。D3D輸入插槽究竟是什麼,以及OpenGL的等價物是什麼?

回答

2

頂點輸入來自存儲在緩衝區中的值數組。 SemanticIndex標識輸入在着色器中的位置。 InputSlot定義哪個緩衝區提供該屬性的數據。緩衝區不受語義索引的約束;他們必然會輸入插槽。

見,D3D有東西兩個數組:語義(匹配在着色器定義的語義其中)的陣列和輸入槽陣列。您使用的每種語義都有一個INPUT_DESC結構,它指定(除其他之外)從語義到輸入它的輸入槽的映射。頂點緩衝區綁定到輸入插槽。任何使用這些插槽的輸入都會從相同的緩衝區中提取數據。一個特定的輸入可以有一個偏移量來訪問它的頂點數據;這允許交錯頂點數據。

OpenGL 4.3/ARB_separate_attrib_format規定similar conceptsglVertexAttribFormatglVertexAttribBinding。前者指定頂點數據到達哪個屬性位置。後者指定哪個緩衝區綁定索引將饋送該屬性。緩衝區綁定緩衝區綁定索引glBindVertexBuffer(s)

當使用較舊的API glBindBuffer(GL_ARRAY_BUFFER)/glVertexAttribPointer,緩衝結合指數和屬性位置索引實際上是相同的。但是這是一個糟糕的API,如果你不需要支持舊的GL版本,我建議你使用更新的東西。