我正在尝试绘制一个将使用Swift中的Metal动画的图形.我已成功绘制了一帧图形.从这张图片中可以看出,图形很简单.我无法弄清楚的是如何MultiSample绘图.一般来说,对Metal的引用似乎很少,特别是在Swift语法方面.
self.metalLayer = CAMetalLayer()
self.metalLayer.device = self.device
self.metalLayer.pixelFormat = .BGRA8Unorm
self.metalLayer.framebufferOnly = true
self.metalLayer.frame = self.view.frame
self.view.layer.addSublayer(self.metalLayer)
self.renderer = SunRenderer(device: self.device, frame: self.view.frame)
let defaultLibrary = self.device.newDefaultLibrary()
let fragmentProgram = defaultLibrary!.newFunctionWithName("basic_fragment")
let vertexProgram = defaultLibrary!.newFunctionWithName("basic_vertex")
let pipelineStateDescriptor = MTLRenderPipelineDescriptor()
pipelineStateDescriptor.vertexFunction = vertexProgram
pipelineStateDescriptor.fragmentFunction = fragmentProgram
pipelineStateDescriptor.colorAttachments[0].pixelFormat = .BGRA8Unorm
pipelineStateDescriptor.colorAttachments[0].blendingEnabled = true
pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperation.Add
pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation = MTLBlendOperation.Add
pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactor.SourceAlpha
pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactor.SourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactor.OneMinusSourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactor.OneMinusSourceAlpha
Run Code Online (Sandbox Code Playgroud)
问题是,我如何平滑这些边缘?
更新:
所以我已经实现了一个MultiSample纹理,并将sampleCount设置为4.我没有注意到任何差异所以我怀疑我做错了什么.
最后:
所以最终确实出现了多次采样的工作原理.最初我有顶点用0 alpha包裹这些"光线".这是使边缘更平滑的技巧.使用这些顶点,多重采样似乎没有改善边缘.当我恢复为每条光线有4个顶点时,多次采样改善了它们的边缘.
let defaultLibrary = self.device.newDefaultLibrary()
let …Run Code Online (Sandbox Code Playgroud)