У меня есть разные типы рисунков, которые я делаю в своем приложении. Например, я рисую фигуры и сетки.
Для каждого типа рисования у меня есть собственный вершинный и фрагментный шейдер и класс, который наследуется от MTKViewDelegate. Каждый из этих классов имеет дело с обработкой, необходимой для вычисления входных данных, и с методом, который выглядит следующим образом и вызывается при init:
private func loadMetal(_ mtkView: MTKView) {
mtkView.colorPixelFormat = .bgra8Unorm_srgb
let defaultLibrary = device.makeDefaultLibrary()!
let vertexProgram = defaultLibrary.makeFunction(name: "grid_vertex")
let fragmentProgram = defaultLibrary.makeFunction(name: "grid_fragment")
let pipelineStateDescriptor = MTLRenderPipelineDescriptor()
pipelineStateDescriptor.vertexFunction = vertexProgram
pipelineStateDescriptor.fragmentFunction = fragmentProgram
pipelineStateDescriptor.colorAttachments[0].pixelFormat = mtkView.colorPixelFormat
pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineStateDescriptor)
commandQueue = device.makeCommandQueue()
vertexBuffer = device.makeBuffer(length: bufferCapacity * MemoryLayout<GridVertex>.stride, options: [])
vertexIndices = device.makeBuffer(length: bufferCapacity * MemoryLayout<UInt16>.size,
options: [])
}
Итак, для каждой пары вершинных / фрагментных шейдеров я создаю pipeDescriptor и команду Queue. Это работает нормально, но мне было интересно, если это нормально, или я должен повторно использовать командуQueue / pipe?