【问题标题】:How to enable/disable DepthMask in Metal iOS如何在 Metal iOS 中启用/禁用 DepthMask
【发布时间】:2016-08-31 07:55:19
【问题描述】:

我正在尝试使用 Metal 来显示一些具有复杂 alpha 的 3D 对象。

我在同一个对象到对象 alpha 混合中得到白边。但在不同的对象中工作正常。

我在 Android 中通过在一个对象中禁用 depthMask 解决了这个问题。

谁能帮助我如何在 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)

【问题讨论】:

    标签: ios metal depth-buffer depth-testing


    【解决方案1】:

    我终于通过以下函数解决了它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 2020-01-30
      • 2017-11-20
      • 2022-01-02
      相关资源
      最近更新 更多