2016-08-31 21 views
0

金属を使用して複雑なアルファを持つ3Dオブジェクトを表示しようとしています。Metal iOSでDepthMaskを有効/無効にする方法

オブジェクトのアルファブレンディングと同じオブジェクトに白いエッジが表示されています。しかし、別のオブジェクトでうまく動作しています。

私は1つのオブジェクト内でdepthMaskを無効にすることでAndroidでこの問題を解決しました。

Metal iOSでどのように手助けできますか?

次のように私のrenderEncoderがある:

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) 

答えて

0

私は次の関数で、それを最終的sovedています

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!) 
    } 
関連する問題