Маскировка в металле iOS - PullRequest
       7

Маскировка в металле iOS

0 голосов
/ 15 февраля 2019

Я сделал такую ​​маскировку в opengl следующим образом

vec4 patCol = texture2D(pattern, samplePos);
vec4 maskCol = texture2D(tex0, texCoordVarying);
gl_FragColor=vec4(patCol.xyz, patCol.w);

Я хочу сделать такую ​​же маскировку в iOS, текстура в maskCol является полупрозрачной.Когда я не мог получить аналогичный выход в металле.Может ли кто-нибудь помочь мне в этом.

Дескриптор рендерпайлина

let pipelineDescriptor = MTLRenderPipelineDescriptor()
pipelineDescriptor.fragmentFunction = fragmentFunction
pipelineDescriptor.vertexFunction = vertexFunction
pipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm
pipelineDescriptor.sampleCount = 1
pipelineDescriptor.colorAttachments[0].isBlendingEnabled = true
pipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add
pipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add
pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .one
pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .one
pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

1 Ответ

0 голосов
/ 18 февраля 2019

Учитывая, что вы не используете maskCol в своем возвращении, я собираюсь предположить, что вы пытались сделать что-то вроде:

    float4 patCol...
    float4 maskCol...
    return float4(patCol.rgb, maskCol.a);

То есть, взяв значение альфа из маски и применив его кthe source patCol ...

Чтобы это работало, вам нужно установить параметры смешивания в вашем pipeDescriptor:

    pipelineDescriptor.colorAttachments[0].isBlendingEnabled = true
    pipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add
    pipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add
    pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
    pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
    pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
    pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

Это даст вам поведение по умолчанию, source-overсмешивание: source.rgba + destination.rgba

...