使用 Metal 設定緩沖區時,您可以通過將某個索引與其關聯來實作,此處為索引 0:
renderCommandEncoder.setVertexBuffer(someBuffer, offset: 0, index: 0)
然后從您的 Metal 著色語言代碼中,您可以使用諸如constant float4x4* projectionMatrix [[ buffer(0) ]].
我遇到的問題是庫和教程似乎鼓勵在某些情況下“自動”設定索引,例如,在加載模型 I/O 網格時,會為您提供一個存盤網格資料的緩沖區陣列。
我看到這些緩沖區有時是這樣設定的:
for (index, buffer) in mesh.vertexBuffers.enumarated() {
renderCommandEncoder.setVertexBuffer(buffer, offset: 0, index: index)
}
我的問題是,與您預先知道將擁有多少緩沖區的情況相反(例如,一個緩沖區用于網格資料(索引 0),一個用于網格世界變換(索引 1),一個用于相機(索引 2) )) 現在,您自己的緩沖區的索引可能會根據您使用模型 I/O 加載的網格進行偏移。
例如,如果模型 I/O 加載一個有兩個緩沖區來表示其資料的網格,您現在必須偏移自己的緩沖區,但是您的金屬著色語言代碼在編譯時無法知道它。
只是模型 I/O 永遠不會加載比您預期更多的緩沖區(因為您可以為記憶體中的頂點指定特定布局?)。我的問題是我正在使用程式網格生成函式(例如生成球體的函式),而這些函式無法自定義,所以我想知道記憶體布局對于這些函式有多穩定。
uj5u.com熱心網友回復:
您可以使用頂點描述符來解決此問題。一種選擇是將所有頂點緩沖區放在更高的緩沖區系結槽中。有點像這樣:
您可以將頂點緩沖區系結開始計算為模型let vertexBufferIndexStart = 31 - bufferLayouts.count的bufferLayouts頂點緩沖區布局陣列。我認為您也可以高于 31,但您必須檢查功能表。
然后,只需bufferIndex在MTLVertexAttributeDescriptor. MTLVertexDescriptor這樣,從 0 到最大緩沖區系結槽數減去頂點緩沖區數的所有緩沖區都可用于系結其他緩沖區。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430658.html
