Я пытаюсь создать и передать динамический c буфер вершин в мой вершинный шейдер в металле.
Согласно документам:
https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/BufferBindings.html
Это возможно, однако, при считывании данных в шейдер с использованием любого из этих трех методов:
{ ссылка }
It кажется, что металл может принимать только атрибуты вершин фиксированной длины.
Я знаю, что если бы можно было передавать данные вершин динамических c, данные должны были бы быть разбиты на числа с плавающей точкой или числа с плавающей точкой4, так как это самый большой доступный тип (см. https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf#page = 18 ), и язык затенения не поддерживает динамические c векторы, но есть ли способ динамически изменить количество этих float4, содержащихся в буфере?
В конечном итоге я пытаюсь поддерживать следующий формат вершин:
struct Vertex {
var x,y,z: f1 //position
var s,t: f1 //texture mapping
var nX,nY,nZ: f1 //normal
var boneWeight: [f1] = []
func floatBuffer() -> [f1] { return [x,y,z,nX,nY,nZ,s,t] + boneWeight }
}
, в котором boneWeight является массивом типа Float, размер которого зависит от количества костей в арматуре объектов.