2016-08-31 3 views
0

J'essaie d'utiliser Metal pour afficher certains objets 3D avec alpha complexe.Comment activer/désactiver DepthMask dans Metal iOS

Je reçois un bord blanc dans le même objet pour s'opposer au mélange alpha. Mais dans un objet différent fonctionne bien.

J'ai résolu ce problème sous Android en désactivant depthMask dans un objet.

Quelqu'un peut-il m'aider à le faire dans Metal iOS?

Mon renderEncoder est la suivante:

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) 

Répondre

0

J'ai enfin soved par la fonction suivante:

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!) 
    }