Metalのブレンディング
前にparticleで雪っぽいものをやってみたんだけど、次にMetalで煙を表現してみようと思ったんだよ。
煙だと雪と違って発火点のような起点があって、、、みたいな話もあるんだけど、今回はそれ以前のブレンディングの話。
というのもいじっててなぜかフラグメントシェーダ内で色のアルファ値をゼロにしてても透明にならないってことがあって何が悪いのかな、、、と調べてたのよ。
WebGLだけど
wgld.org | WebGL: ブレンドファクター |
↑ここの話はとても参考になったわ。
具体的にはコードはこんな感じに。ええ、Objective-Cです。
MTLRenderPipelineDescriptor のオブジェクトが pipelineStateDescriptor ね。
いやこれまだ途中で、particleは単に落下してるだけなんだけど、すでに噴出したparticleは現在の起点の位置に影響しない、というのは一応できてる。
次は煙らしく上へ行くようにしないと。
煙だと雪と違って発火点のような起点があって、、、みたいな話もあるんだけど、今回はそれ以前のブレンディングの話。
というのもいじっててなぜかフラグメントシェーダ内で色のアルファ値をゼロにしてても透明にならないってことがあって何が悪いのかな、、、と調べてたのよ。
WebGLだけど
wgld.org | WebGL: ブレンドファクター |
↑ここの話はとても参考になったわ。
具体的にはコードはこんな感じに。ええ、Objective-Cです。
MTLRenderPipelineDescriptor のオブジェクトが pipelineStateDescriptor ね。
pipelineStateDescriptor.colorAttachments[0].blendingEnabled = YES; pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperationAdd; pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation =MTLBlendOperationAdd; pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;//MTLBlendFactorOne; pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactorOne; pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha; pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactorOne;//MTLBlendFactorOneMinusSourceAlpha;二箇所ほどコメントで消してるのがあるけど消す前がAPPLEのサンプルコード MetalShaderShowcase のparticle関連部分での設定。これだとアルファ値ゼロでも透明にならなかったので先のリンク先記事を参考にこのように修正、かつ、シェーダ内でRGBとアルファ値を別々に計算。その結果がこんなの。
いやこれまだ途中で、particleは単に落下してるだけなんだけど、すでに噴出したparticleは現在の起点の位置に影響しない、というのは一応できてる。
次は煙らしく上へ行くようにしないと。
スポンサーサイト
<< 数式を画像出力してくれるサービスを使ってみた TopPage Metalで二つのshaderを使う >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/973-032b90e9
https://ringsbell.blog.fc2.com/tb.php/973-032b90e9