色の合成

本物のページはこちら→compositing

しかし、実際にうまくいくのは、

glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA);

点の並びを気にしなくても、どこから見ても同じ見栄えになる。見た目もボリュームレンダリングっぽい。半透明で光ってるかんじになる。
これを使うときは、DEPTH_TESTをenableにしてはいけない。

視線から遠い順に0~i
ハット付きがdestでハット無しがsrcかな?

back-to-front

普段、アルファブレンディングする時によくやっているのがこれである。

(1)
\begin{align} \hat{C_i} = \hat{C_{i-1}}(1-\alpha_i)+C_i \end{align}
(2)
\begin{align} \hat{T_i}=\hat{T_{i-1}}(1-\alpha_i) \end{align}

with initialization

(3)
\begin{align} \hat{C_0}=C_0 \hat{T_0}=1-\alpha_0 \end{align}
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_BLEND);

フラグメントシェーダのコード

dst.rgb = (1.0-src.a) * dst.rgb + src.a*src.rgb;
            dst.a   = (1.0-src.a)  * dst.a   + src.a;
            uvw=uvw-direction;

front-to-back

RayCastingの時、これをやっている。
背景色が黒以外の時、薄い部分が暗くなるのって、これの特性?

(5)
\begin{align} C_{dst}=C_{dst}+(1-\alpha_{dst})C_{src} \end{align}
(6)
\begin{align} \alpha_{dst}=\alpha_{dst}+(1-\alpha_{dst})\alpha_{src} \end{align}
glBlendFuncSeparate(GL_DST_ALPHA,GL_ONE,GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

フラグメントシェーダのコード

//front-to-back
            dst.xyz = (1.0-dst.a) * src.a * src.xyz + dst.xyz;
            dst.a   = (1.0-dst.a)  * src.a   + dst.a;
            uvw=uvw+direction;
Bibliography
1. blinnの元ネタはこれblinn_theory.pdf

サポートサイト Wikidot.com