Файл obj, загруженный с Model I / O.Я получаю вершинный буфер и индексный буфер из сетки и вложенной сетки.Я рисую это с индексным буфером.В графический процессор распаковывается и загружаются все треугольники.Когда я загружаю ресурс, я создаю дескриптор вершины, чтобы сказать, что должно быть загружено из трехмерного ресурса.Когда я передаю его в шейдер, я использую параметр вершины [[ stage_in ]]
.
Но каким-то образом мне нужно изменить структуру вершины, которая создается путем загрузки ресурса модели в параметре функции вершинного шейдера, чтобы передавать больше данных со смещением анимации для каждой вершины.Например мне нужно передать данные, которые в 3D активе, чтобы применить смещение ко всем вершинам.
vertex VertexOut vertex_main(VertexIn vertexIn [[ stage_in ]], constant Uniforms &uniforms [[ buffer(1) ]], uint vertexID [[ vertex_id ]]) {
float4 worldPosition = uniforms.modelMatrix *float4(vertexIn.position, 1);
VertexOut vertexOut;
vertexOut.position = uniforms.viewProjectionMatrix * worldPosition;
vertexOut.worldPosition = worldPosition.xyz;
vertexOut.worldNormal = uniforms.normalMatrix * vertexIn.normal;
vertexOut.texCoords = vertexIn.texCoords;
return vertexOut;
}
Вот как выглядит VertexIn
struct VertexIn {
float3 position [[attribute(0)]];
float3 normal [[attribute(1)]];
float2 texCoords [[attribute(2)]];
};
Рисование трехмерного актива
for mesh in meshes {
for i in 0..<mesh.vertexBuffers.count {
let vertexBuffer = mesh.vertexBuffers[i]
commandEncoder.setVertexBuffer(vertexBuffer.buffer, offset: vertexBuffer.offset, index: i)
}
for submesh in mesh.submeshes {
let indexBuffer = submesh.indexBuffer
commandEncoder.drawIndexedPrimitives(type: submesh.primitiveType,
indexCount: submesh.indexCount,
indexType: submesh.indexType,
indexBuffer: indexBuffer.buffer,
indexBufferOffset: indexBuffer.offset)
}
}
Дескриптор вершины для загрузки актива 3D-модели
let vertexDescriptor = MDLVertexDescriptor()
vertexDescriptor.attributes[0] = MDLVertexAttribute(name: MDLVertexAttributePosition, format: .float3, offset: 0, bufferIndex: 0)
vertexDescriptor.attributes[1] = MDLVertexAttribute(name: MDLVertexAttributeNormal, format: .float3, offset: MemoryLayout<Float>.size * 3, bufferIndex: 0)
vertexDescriptor.attributes[2] = MDLVertexAttribute(name: MDLVertexAttributeTextureCoordinate, format: .float2, offset: MemoryLayout<Float>.size * 6, bufferIndex: 0)
vertexDescriptor.layouts[0] = MDLVertexBufferLayout(stride: MemoryLayout<Float>.size * 8)
Спасибо за помощь.PS Я пытался изменить после загрузки 3D-актива, но это не удалось, потому что я не могу изменить буфер вершин, созданный с помощью модели ввода / вывода.