Ruban4Axis
Ruban4Axis

Reputation: 841

Blend Mode in Metal

These are the two the blend-mode i used in OpenGL what is the conversion to the metal in IOS

glEnable(GL_BLEND);

glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE_MINUS_SRC_ALPHA);

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_SRC_ALPHA, GL_ONE);

Upvotes: 9

Views: 2575

Answers (2)

jeff
jeff

Reputation: 172

    // source: last draw.
    // destination: previous draw.
    // when use UIGraphicsGetCurrentContext() create UIImage from UIColor. alpha will be premultiplied to RGB.
    // RGB = (Source.rgb * Source.a) + (Dest.rgb * (1 - Source.a))
    // A = (Source.a * Source.a) + (Dest.a * (1 - Source.a))
    /*
    pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
    pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
    pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
    pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha
     */

    // source: last draw.
    // destination: previous draw.
    // when use UIGraphicsGetCurrentContext() create UIImage from UIColor. alpha will be premultiplied to RGB.
    // RGB = (Source.rgb * Source.a) + (Dest.rgb * (1 - Source.a))
    // A = (Source.a * Source.a) + (Dest.a * (1))
    pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
    pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
    pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
    pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .one

Upvotes: -1

warrenm
warrenm

Reputation: 31782

You configure blending on your render pipeline descriptor. I believe the equivalent configurations for your GL code are:

// glEnable(GL_BLEND)
renderPipelineDescriptor.colorAttachments[0].isBlendingEnabled = true

// glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE_MINUS_SRC_ALPHA)
renderPipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
renderPipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
renderPipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .one
renderPipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

// glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_SRC_ALPHA, GL_ONE)
renderPipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
renderPipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .one
renderPipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
renderPipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .one

Upvotes: 15

Related Questions