完全に透明なポリゴンを重ねても結果は変わらない、という当たり前の話なのですが、この論文の前の手法では値が変化していました。半透明なポリゴンを加算合成したり、乗算合成する必要があるわけですが、不透明オブジェクトの後ろにある半透明オブジェクトは描画されない(遮蔽される。当然)必要があります。MainCameraの不透明オブジェクトのZバッファを使いまわすことが出来ればよいのですが、出来ない(やり方が分からない)ようですので、非効率ですが別カメラで両方ともレンダリングします。別カメラでレンダリングするとしても、1と2は同一バッファ(RGBA)に入りますが、3は別のバッファに描画する必要があります(チャネル数が一つ足りないので)。MRTを用いて1&2,3を二つのバッファに同時にレンダリングすることは出来ますが、ここではシンプルに、通常のレンダーターゲット(MainCameraの)のαチャネルをΠ(1-α)の格納に用います。(普通α値はグローエフェクトなどに用いられていますが、それは使わないことが前提です。)以下はΠ(1-α)を格納するための、α値だけを出力するシェーダです。(色を出力しないため、エディタ上では見えなくなります。OneMinusSrcAlphaにより、destination(背景)に半透明オブジェクトの(1-α)を掛けたものがα値に格納されます。Aにより、RGB値はマスクされ変化せず、α値のみ出力します。(カラーは最終的に合成して描画します)すべての半透明オブジェクトのピクセルを描画するため、ZWriteはオフにして、半透明オブジェクトによって他の半透明オブジェクトが遮蔽されるのを防ぎます。(不透明オブジェクトによっては普通に遮蔽される必要がありますので、ZTestは行います)ここで得られるα値(Π(1-α)は遮蔽されない(=背景が見える割合)率になります。次に、別カメラでの描画について解説します。RT0);}}RenderTargetを作成し、ReplacementShaderを使ってレンダリングを行い、シェーダのグローバル変数としてテクスチャを設定しています。(グローバル変数に設定するとすべてのシェーダからアクセス可能になります。ここではシンプルにするためそうしているだけで、実際には特定のマテリアルにテクスチャを渡すべき...かも)RenderWithShaderをUpdate関数内で呼んでいますが、これはMainCameraの結果とずれてしまうのでもう少し適切な場所に配置すべきだと思います。