मैं वर्तमान में एक ग्राफिक खींचने की कोशिश कर रहा हूं जो स्विफ्ट में धातु का उपयोग करके एनिमेटेड होगा। मैंने अपने ग्राफिक के एक फ्रेम को सफलतापूर्वक खींचा है। ग्राफिक सरल है, जैसा कि आप इस छवि से देख सकते हैं। मैं यह नहीं समझ सकता कि ड्राइंग को मल्टी नमूना कैसे करें। सामान्य रूप से धातु पर बहुत कम संदर्भ प्रतीत होता है, खासकर स्विफ्ट वाक्यविन्यास के संबंध में।धातु में बहु-नमूना/जालीदार किनारों (आईओएस)
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
सवाल है, मैं कैसे इन सिरों को सम करते हैं?
अद्यतन:
तो मैं एक MultiSample बनावट लागू किया और 4. करने के लिए sampleCount सेट मैं किसी भी अंतर नोटिस नहीं है इसलिए मुझे लगता है मैंने कुछ गलत किया है।
अंतिम:
तो अंत में यह दिखाई बहु नमूना काम करता है। शुरुआत में मेरे पास 0 अल्फा के साथ इन "किरणों" को लपेटने वाले शिखर थे। यह आसान किनारों को बनाने के लिए एक चाल है। इन शिखरों के साथ, मल्टीसाम्प्लिंग किनारों को बेहतर नहीं लग रहा था। जब मैं वापस प्रति लौ 4 शिखर तक वापस लौटा, तो बहु-नमूनाकरण ने अपने किनारों में सुधार किया।
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.sampleCount = 4
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
let desc = MTLTextureDescriptor()
desc.textureType = MTLTextureType.Type2DMultisample
desc.width = Int(self.view.frame.width)
desc.height = Int(self.view.frame.height)
desc.sampleCount = 4
desc.pixelFormat = .BGRA8Unorm
self.sampletex = self.device.newTextureWithDescriptor(desc)
// When rendering
let renderPassDescriptor = MTLRenderPassDescriptor()
renderPassDescriptor.colorAttachments[0].texture = sampletex
renderPassDescriptor.colorAttachments[0].resolveTexture = drawable.texture
renderPassDescriptor.colorAttachments[0].loadAction = .Clear
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 23/255.0, green: 26/255.0, blue: 31/255.0, alpha: 0.0)
renderPassDescriptor.colorAttachments[0].storeAction = .MultisampleResolve
let commandBuffer = commandQueue.commandBuffer()
let renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
renderEncoder.setRenderPipelineState(pipelineState)
ध्यान दें कि चरण 2 में, आपको एमएसएए बनावट के 'स्टोरेज मोड' को 'MTLStorageModePrivate' पर भी सेट करना होगा। आदर्श रूप में, आपको 'उपयोग' को' MTLTextureUsageRenderTarget' पर भी सेट करना चाहिए। – warrenm