Как анимировать файл 3D актива (.obj), загруженный с платформой Model I / O на металле - PullRequest
0 голосов
/ 16 ноября 2018

Файл 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-актива, но это не удалось, потому что я не могу изменить буфер вершин, созданный с помощью модели ввода / вывода.

...