Metalでブレンディングをする方法をメモ。
MTLRenderPipelineDescriptor
のプロパティにあるMTLRenderPipelineColorAttachmentDescriptor
の値を適切に設定することで、様々なブレンディングができます。
ちなみに値についてはこちら(Translucency and Transparency in Metal)を参考にしました。
MTLRenderPipelineColorAttachmentDescriptor *colorAttachment = pipelineStateDescriptor.colorAttachments[0];
colorAttachment.blendingEnabled = YES;
colorAttachment.rgbBlendOperation = MTLBlendOperationAdd;
colorAttachment.alphaBlendOperation = MTLBlendOperationAdd;
colorAttachment.sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;
colorAttachment.sourceAlphaBlendFactor = MTLBlendFactorSourceAlpha;
colorAttachment.destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
colorAttachment.destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
一般的なアルファブレンディングはOneMinusSourceAlpha
を利用します。
式は以下のようになります。
C_f = \alpha_s \times C_s + (1 - \alpha_s) \times C_d
$._s$となっている部分はsource
のs
です。
$._d$となっている部分はdestination
のd
、つまりブレンド対象の色、ということになります。
(C
はColorのC
です)
式を見てもらうと分かるように、計算の要が$\alpha_s$となっているのが分かると思います。今まさにレンダリングしようとしている色のアルファ値が、最終的な色に影響を与えているわけです。
式でもOneMinusAlpha($1 - \alpha_s$)となっていますね。
そしてそれらを適切に表現した設定が上記のもの、ということになります。
ちなみにこちらの記事(Cocos2d-x で BlendFunc)が色々なブレンディングについて書かれていました。
(内容はCocos2d-xのものですが、基本的な考え方はどれも同じです)