BlenderでComposite作業をしているとき、透過画像を操作しているときにどうしても思うようにならない場面が出てきたのでAlphaの扱いについて勉強したことをまとめました。
- 背景透過の仕方
- プリマルチプライドアルファとストレートアルファの違い
- 透過が関係するノードの使い方
などを解説しています。
背景の透過
背景を透過させるためには、レンダープロパティのFilmタブ中のTransparentにチェックをする必要があります。
チェックをしていない場合はコンポジットでは背景がワールドで設定したカラーとなり、透過していません


Transparentにチェックすると、Layout画面でも、背景にチェック模様が見えるようになり、透過されます。

コンポジット画面でもRender Layerのプレビュー画面で背景にチェック模様が表示されます。Backdropでは、周囲の色と背景が同色になります。

PNG形式、ColorをRGBAに設定して印刷すると、背景が透過したPNG画像を出力できます。


Compositeノード、ViewerノードのUse Alpha
Compositeノード、ViewerノードにもAlphaの設定があり、意外とよくわからない挙動をしています。
□Use Alpha
Use Alphaのチェックを外すと、3Dオブジェクトのレイアウト画面で透過させようが、アルファチャンネルが無効化され、色面になります。

Alpha
Alphaの値を下げれば、透過していくかと思いきや、表示にも印刷にも変化がありません。
この値で透過を調整することはできず、何の機能か謎です。画像の透明度を調整するにはSet Alphaノードを使います(下の方で解説しています)

2通りのアルファチャンネルの扱い
Compositeノード、Viewerノードの□Use Alphaプロパティは、マニュアルには以下のように記されています
アルファチャンネルを使用し、色はアルファプリマルチプライドとして扱われます。無効にすると、アルファチャンネルは1に設定され、色はアルファストレートとして扱われます。つまり、色チャンネルは変更されません。
プリマルチプライドとストレートのアルファとは何なのでしょうか?実はCGソフトなどの色表現において重要な概念です。以下、この二種類のアルファについて解説します。
基本的な色の情報の構成
色を表現しようとするとき、各ピクセルにRGBA形式の色の情報を持たせている
- RGB(Red, Green, Blue)
→ 色そのものの情報(=光の三原色) - A(Alpha)
→ 透明度の情報(0: 完全に透明、1: 完全に不透明)

このアルファ値の扱いについてプリマルチプライドとストレートの二種類があります。
ストレート
RGBとAを別々の情報として持っておく。徐々に透明になる赤でも、RGBとして持っている情報はただの赤です。
プリマルチプライド
RGBには、RGBと透明度の値がかけあわされた値が保持される
徐々に透明になる赤の場合、黒へのグラデーションとしてRGBの値が保持されています。

CGの色を表示する際は、RGBとAの色情報を読み取り、透過させています。Blenderでは標準ではプリマルチプライドアルファを使用しているそうです。
しかし、RGBノードなどはストレートで出てくるなど、ノードの組み方によってはストレートで出てくることもあるので注意が必要だと思います

プリマルチプライドの方が透明度との乗算が済んでいる分処理が早い、ストレートは情報をそのまま保持しているため編集・復元素材として正確性が高いです。
モードによって出る問題
フリンジ(フチに出る汚れ)などアーティファクトが出るかどうかは、
- プリマルチプライドをストレートとして処理する
- ストレートをプリマルチプライドとして処理する
- プリマルチプライドの重ね掛け(フチが黒くなる)
- ストレートの重ね掛け(白くなる)
があると出やすいらしいですが、Blenderでは大体ストレートのときに不具合が出ることが多いため、プリマルチプライドにすることで直ることが多い。(下記、Alpha Overノードの項目を参照してみてください)
Alpha Convertノード
プリマルチプライドとストレートの切り替えを行いたいときはAlpha Convertノードを使います
- To Premultiplied…プリマルチプライドとする(アルファ値を掛ける)
- To Straight…ストレートとする(アルファ値で割る?)

例えばブラーをかけた背景透過の画像をコンポジットノードで出力します。
画像ノードから出ているのはデフォルトではプリマルチプライドなのでそのまま背景が透過しています。

ストレートにする
To Straightでストレートにすると、RGBの値からアルファの値をかけていたものがなくなり(アルファの値を割ってる?)フチの部分まで色面となります。

Alpha Convertは重ねてつなぐと、ノードの数だけ処理をするので、フチがどんどん白くなり、値が大きくなっているのがわかります。

プリマルチプライドにする
To Premultipliedでプリマルチプライドにすると、アルファ値がRGBにかけられます。
最初から透過画像の場合変化がわかりにくいですが、

こちらも重ねてつなげると、どんどんエッジ部分のアルファ値がかけられてやせほそっていきます。
基本的にはストレートの画像をプリマルチプライドにするために使った方が良いです。画像の色情報が変化してしまいます。

Alpha OVerノード
Alpha Overノードは画像の上に透過画像をのせることができます。
デフォルトでプリマルチプライドに対応しているので、Imageノードからの透過画像はそのまま合成することができます。

ストレートの画像を合成すると、フチに色情報が残ってしまい、綺麗に合成できません。

ストレートの画像を合成するときは、Alpha OverノードのConvert Premultipledにチェックを入れることでアルファ値が掛けられ、綺麗に合成できるようになります。

ちなみにPremultipliedの画像をさらにAlpha OverノードのConvert Premultipliedにチェックを入れると、フチが少し黒っぽくなります。
※その下のPremultipliedの値は、段階的にプリマルチプライドにすることができ、フチの色などの調整ができます。

Set Alphaノード
画像全体の透明度を調整するにはSet Alphaノードを使います。
Mode:
Apply Mask…入力イメージのRGBAチャンネルにAlphaの値を掛けます。プリマルチプライドとして出力
元のアルファ値が0の場合は影響は受けません。掛けるので透過度が全体的に上がります。

0.5などで半透明にした画像を出力することができます。

Replace Alpha…入力イメージのアルファ値を、入力したAlpha値に変更してしまう。
出力はストレートになります。
全体の透過度が一定の値に変更されてしまいます。

0で透明だった背景も透過度が0.5になる。全体の透過度が入力したAlpha値になる

その他のトラブル
マテリアルシェーダーでのαのモードのトラブルについて書いた記事がありますが、こっちはあまりよくわかっていません。同様のトラブルがあった場合に置いておきます。