I am trying to use Metal to display some 3D objects with complex alpha.
I am getting white edge in same object to object alpha blending. But in different object is working fine.
I had solved this issue in Android by disabling depthMask within one object.
Can anyone help me how to do it in Metal iOS?
My renderEncoder is as follows:
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;
pipelineStateDescriptor.depthAttachmentPixelFormat = .Depth32Float
pipelineState = try! device.newRenderPipelineStateWithDescriptor(pipelineStateDescriptor)
let depthStencilDescriptor = MTLDepthStencilDescriptor()
depthStencilDescriptor.depthCompareFunction = .Less
depthStencilDescriptor.depthWriteEnabled = true
depthStencilState = device.newDepthStencilStateWithDescriptor(depthStencilDescriptor)
let renderPassDescriptor = MTLRenderPassDescriptor()
renderPassDescriptor.colorAttachments[0].texture = drawable.texture
renderPassDescriptor.colorAttachments[0].loadAction = .Clear
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
renderPassDescriptor.colorAttachments[0].storeAction = .Store
renderPassDescriptor.depthAttachment.loadAction = .Clear
renderPassDescriptor.depthAttachment.clearDepth = 1.0
renderPassDescriptor.depthAttachment.storeAction = .MultisampleResolve
let commandBuffer = commandQueue.commandBuffer()
commandBuffer.addCompletedHandler { (commandBuffer) -> Void in
dispatch_semaphore_signal(self.bufferProvider.avaliableResourcesSemaphore)
}
renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
//For now cull mode is used instead of depth buffer
renderEncoder.setCullMode(MTLCullMode.Front)
renderEncoder.setDepthClipMode(.Clip)
renderEncoder.setRenderPipelineState(pipelineState)
renderEncoder.setDepthStencilState(depthStencilState)
I have finally soved it by the following function:
class func defaultSampler(device: MTLDevice) -> MTLSamplerState
{
let pSamplerDescriptor:MTLSamplerDescriptor? = MTLSamplerDescriptor();
if let sampler = pSamplerDescriptor
{
sampler.minFilter = MTLSamplerMinMagFilter.Linear
sampler.magFilter = MTLSamplerMinMagFilter.Linear
sampler.mipFilter = MTLSamplerMipFilter.Linear
sampler.maxAnisotropy = 1
sampler.sAddressMode = MTLSamplerAddressMode.ClampToZero
sampler.tAddressMode = MTLSamplerAddressMode.ClampToZero
sampler.rAddressMode = MTLSamplerAddressMode.ClampToZero
sampler.normalizedCoordinates = true
sampler.lodMinClamp = 0
sampler.lodMaxClamp = FLT_MAX
}
else
{
print(">> ERROR: Failed creating a sampler descriptor!")
}
return device.newSamplerStateWithDescriptor(pSamplerDescriptor!)
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.