iOS Metal低饱和度低透明度颜色渲染异常问题求助
问题:MTKView低饱和度半透明三角形渲染消失,SwiftUI同参数显示正常
现象细节
使用MTKView渲染三角形时,多数场景表现正常,但降低颜色饱和度和透明度后,三角形会完全透明。相同参数创建的SwiftUI Color则显示正常:
- 仅低饱和度颜色触发问题:100%饱和度颜色(如
#FF0000)即使仅1%透明度仍可正常渲染 - 以颜色
#FF8888测试不同像素格式的表现:bgra8Unorm:需至少55%透明度才能渲染bgra8Unorm_srgb:需至少77%透明度才能渲染,且颜色明显偏浅
排查情况
- Swift中颜色存储为
[Float],MSL中转为float4*,顶点和片段函数仅返回输入值,其他颜色渲染正常,排除这部分代码问题 - 修改MTKView的
colorPixelFormat会改变结果,但不确定是否仅需调整该参数,也不清楚正确的格式选择
代码配置
MTKView基础配置
clearColor = MTLClearColor(red: 0, green: 0, blue: 0, alpha: 0) isOpaque = false layer.magnificationFilter = .nearest layer.minificationFilter = .nearest
渲染管线状态设置
let pipelineDescriptor = MTLRenderPipelineDescriptor() pipelineDescriptor.vertexFunction = vertexFunction pipelineDescriptor.fragmentFunction = fragmentFunction pipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm pipelineState = try? device.makeRenderPipelineState(descriptor: pipelineDescriptor)
绘制逻辑代码
guard let vertexBuffer = vertexBuffer, let indexBuffer = indexBuffer, let indexCount = indexCount, let colorBuffer = colorBuffer, let pipelineState = pipelineState, let discriptor = view.currentRenderPassDescriptor, let commandBuffer = commandQueue.makeCommandBuffer(), let commandEncoder = commandBuffer.makeRenderCommandEncoder( descriptor: discriptor ), let drawable = view.currentDrawable else { return } commandEncoder.setRenderPipelineState(pipelineState) commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) commandEncoder.setVertexBuffer(colorBuffer, offset: 0, index: 1) commandEncoder.drawIndexedPrimitives( type: .triangle, indexCount: indexCount, indexType: .uint32, indexBuffer: indexBuffer, indexBufferOffset: 0 ) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit()
内容的提问来源于stack exchange,提问作者Son Nguyen
相关产品推荐
相关产品推荐

