Я пытаюсь заставить работать мультисэмплинг с MTKView
.У меня есть MTKView
с делегатом.Я устанавливаю для свойства sampleCount
представления значение 4. Я создаю дескриптор состояния конвейера с параметром rasterSampleCount
, равным 4, и использую его для создания состояния конвейера рендеринга, которое я использую при рендеринге.
В делегатеМетод draw(in:)
, я создаю дескриптор прохода рендеринга, получая текущий дескриптор прохода рендеринга представления и устанавливая storeAction
в multisampleResolve
.Я также установил попробовать storeAndMultisampleResolve
безрезультатно.
Я создал текстуру разрешения для дескриптора прохода рендеринга, и она имеет ту же ширину и высоту, что и вид, и в том же формате пикселей.
Учитывая вышесказанное, я получаю полную красную рамку во время рендеринга.Я использовал металлический отладчик для просмотра текстур, и как текстура вида, так и текстура разрешения имеют правильный рендеринг.Я нахожусь на машине AMD, где полностью красная текстура часто указывает на неинициализированную текстуру.
Нужно ли что-нибудь сделать, чтобы рендеринг вышел на экран?
Вот как яЯ устанавливаю вид, состояние конвейера и текстуру разрешения:
metalView = newMetalView
metalView.sampleCount = 4
metalView.clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
device = newMetalView.device!
let metalLibrary = device.makeDefaultLibrary()!
let vertexFunction = metalLibrary.makeFunction(name: "vertexShader")
let fragmentFunction = metalLibrary.makeFunction(name: "fragmentShader")
let pipelineStateDescriptor = MTLRenderPipelineDescriptor.init()
pipelineStateDescriptor.label = "Particle Renderer"
pipelineStateDescriptor.vertexFunction = vertexFunction
pipelineStateDescriptor.fragmentFunction = fragmentFunction
pipelineStateDescriptor.colorAttachments [ 0 ].pixelFormat = metalView.colorPixelFormat
pipelineStateDescriptor.rasterSampleCount = 4
do {
try pipelineState = device.makeRenderPipelineState(descriptor: pipelineStateDescriptor)
} catch {
NSLog("Unable to create pipeline state")
pipelineState = nil
}
let textureDescriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: metalView.colorPixelFormat, width: Int(metalView.bounds.width), height: Int(metalView.bounds.height), mipmapped: false)
resolveTexture = device.makeTexture(descriptor: textureDescriptor)!
И вот как я рисую:
let commandBuffer = commandQueue.makeCommandBuffer()
commandBuffer?.label = "Partcle Command Buffer"
let renderPassDescriptor = metalView.currentRenderPassDescriptor
renderPassDescriptor?.colorAttachments[0].clearColor = MTLClearColorMake(0.0, 0.0, 0.0, 0.0)
renderPassDescriptor?.colorAttachments[0].loadAction = MTLLoadAction.clear
renderPassDescriptor?.colorAttachments[0].storeAction = MTLStoreAction.multisampleResolve
renderPassDescriptor?.colorAttachments[0].resolveTexture = resolveTexture
let renderEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: renderPassDescriptor!)
renderEncoder?.label = "Particle Render Encoder"
renderEncoder?.setViewport(MTLViewport(originX: 0.0, originY: 0.0, width: Double(viewportSize.x), height: Double(viewportSize.y), znear: -1.0, zfar: 1.0))
renderEncoder?.setRenderPipelineState(pipelineState!);
Затем я выполняю вызовы рисования, а затем заканчиваювверх по вызову:
renderEncoder?.endEncoding()
commandBuffer?.present(metalView.currentDrawable!)
commandBuffer?.commit()
Вот что отладчик показывает в моих текстурах:
Странно, при выполнении этой отладкиЯ случайно спрятал Xcode, и для 1 кадра вид показал правильную текстуру.