gpt4 book ai didi

swift - 如何在 MTKView 中使用多重采样?

转载 作者:搜寻专家 更新时间:2023-10-31 19:26:56 26 4
gpt4 key购买 nike

我正在尝试使用 MTKView 进行多重采样。我有一个带有委托(delegate)的 MTKView。我将 View 的 sampleCount 属性设置为 4。我创建了一个将 rasterSampleCount 设置为 4 的管道状态描述符,并使用它来制作我在渲染时使用的渲染管道状态.

在委托(delegate)的 draw(in:) 方法中,我通过获取 View 的当前渲染过程描述符并将 storeAction 设置为 multisampleResolve 创建渲染过程描述符。我还设置了试过的 storeAndMultisampleResolve 无济于事。

我已经为渲染过程描述符创建了一个解析纹理,它与 View 具有相同的宽度和高度以及相同的像素格式。

鉴于上述情况,我在渲染过程中得到了一个完整的红色框。我使用 Metal 调试器查看纹理, View 纹理和解析纹理都具有正确的渲染。我在一台 AMD 机器上,其中全红色的纹理通常表示未初始化的纹理。

我需要做些什么才能让渲染显示在屏幕上吗?

以下是我设置 View 、管道状态和解析纹理的方式:

    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()

这是调试器在我的纹理中显示的内容:

enter image description here

奇怪的是,在进行调试时,我不小心隐藏了 Xcode,并且对于 1 帧, View 显示了正确的纹理。

最佳答案

renderPassDescriptor 的初始配置是什么(从 metalView.currentRenderPassDescriptor 返回?

我相信您希望将颜色附件的 texture 设置为 metalView.multisampleColorTexture 并将其 resolveTexture 设置为 metalView.currentDrawable.texture 。也就是说,它应该对多采样纹理进行主要的多采样渲染,然后解析为可绘制纹理以在 View 中实际绘制它。

我不知道 MTKView 是否会在 sampleCount > 1 时自动设置其 currentRenderPassDescriptor。理想情况下,它会。

关于swift - 如何在 MTKView 中使用多重采样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52846343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com