我有一个金属视图显示一些纹理的四边形。纹理是从PNG加载的,因此是预乘的。一些纹理具有透明像素。
当我启用混合和绘制以正确的顺序,透明度工作,你可以看到其他四边形通过透明部分的纹理。然而,我必须通过排序来计算正确的绘制顺序,这是非常昂贵的,并且大大降低了渲染速度。
当我尝试使用深度模板并按任何顺序绘制时,我可以使用z位置使命令正确工作,但是混合停止工作。纹理的透明部分显示的是金属场景的背景颜色,而不是下面的四层。
我做错了什么?是否有办法使这一工作,谁能提供一些示例代码吗?
我看到的另一个选项是尝试在GPU上进行排序,这会很好,因为GPU帧时间比CPU帧时间要小得多。不过,我也不知道该怎么做。
任何帮助都将不胜感激。:)
发布于 2022-12-01 11:24:19
您需要正确设置pipelineStateDescriptor:
// To have depth buffer.
pipelineStateDescriptor.depthAttachmentPixelFormat = .depth32Float
// To use transparency.
pipelineStateDescriptor.colorAttachments[0].isBlendingEnabled = true
pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = .add
pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation = .add
pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha
希望这能有所帮助。
https://stackoverflow.com/questions/41877447
复制相似问题