ホームに戻る
 透過処理

図03_00:テクスチャのアルファチャンネル A=0 で四角形の中心を透過 白色部分は A=200

ソースコード:glut03_alpha.c
 解説

透過処理

透過処理だけではなく、色の組み合わせに関しては、
glBlendFunc を使用する。
有効にするには glEnable(GL_BLEND) とする。
第1引数に新しい色(source)について、
第2引数には元の色(distination)について、
それぞれ計算方法を指定できる。

このとき例えば四角い平面に三角形を描画するとき、
三角形の色が新しい色となり、四角形の色は元の色となる。

元の色の上に新しい色をかぶせたときに、
具体的にはどうなるか?

まず新しい色の情報と、元の色の情報がわかる。

(Rs,Gs,Bs,As)、(Rd,Gd,Bd,Ad)

k は指定できる最大の整数値のこと。

(kR,kG,kB,kA)

(0,0,0,0)-(255,255,255,255)であれば、
kR=255、kG=255、kB=255、kA=255となる。

i は特別で i = min(As,kA-Ad) / kA となる。
min は第1引数と第2引数の小さいほうをとる。

この数値と指定した方法で、
混合前の計算を行い新しい色と元の色、

(Sr,Sg,Sb,Sa)、(Dr,Dg,Db,Da)

を決める。

以下は、指定に対する求め方。

GL_ZERO:(0,0,0,0) 
GL_ONE:(1,1,1,1) 
GL_SRC_COLOR:(Rs/kR,Gs/kG,Bs/kB,As/kA)
GL_ONE_MINUS_SRC_COLOR:(1,1,1,1) - (Rs/kR,Gs/kG,Bs/kB,As/kA)
GL_DST_COLOR:(Rd/kR,Gd/kG,Bd/kB,Ad/kA)
GL_ONE_MINUS_DST_COLOR:(1,1,1,1) - (Rd/kA,Gd/kA,Bd/kA,Ad/kA)
GL_SRC_ALPHA:As/kA,As/kA,As/kA,As/kA
GL_ONE_MINUS_SRC_ALPHA:(1,1,1,1) - (As/kA,As/kA,As/kA,As/kA)
GL_DST_ALPHA:(Ad/kA,Ad/kA,Ad/kA,Ad/kA)
GL_ONE_MINUS_DST_ALPHA:(1,1,1,1) - (Ad/kA,Ad/kA,Ad/kA,Ad/kA)
GL_SRC_ALPHA_SATURATE:(i,i,i,1)

混合後の色は例えば赤なら、

R = Rs*Sr + Rd*Dr

となる。
このとき計算結果は最大値 kR を超えない。


計算例

(kR,kG,kB,kA)=(255,255,255,255)

新しい色(半透明の赤色)、

(Rs,Gs,Bs,As)=(255,0,0,100)

元の色(不透明の白色)、

(Rd,Gd,Bd,Ad)=(255,255,255,255)

計算方法

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

以上のとき、

新しい色は GL_SRC_ALPHA の計算のため、

(Sr,Sg,Sb,Sa)=(100/255,100/255,100/255,100/255)

元の色は GL_ONE_MINUS_SRC_ALPHA の計算のため、

(Dr,Dg,Db,Da)=(1,1,1,1)-(100/255,100/255,100/255,100/255)
             =(155/255,155/255,155/255,155/255)

よって混合を計算すると、

(R,G,B,A)=(255,0,0,100)*(100/255,100/255,100/255,100/255)
          +(255,255,255,255)*(155/255,155/255,155/255,155/255)
         =(100,0,0,39)+(155,155,155,155)
         =(255,155,155,194)

結果は(255,155,155,194)となり、
赤色が透過して背景の白に影響し白っぽい赤になったのがわかる。

アルファテスト

あるアルファ値を閾値として透過するかしないかを決めることもできる。
glEnable で GL_ALPHA_TEST を有効にする。
glAlphaFunc で通過する際の評価法を指定する。

GL_NEVER:全て採用されない
GL_LESS:元のアルファ値より値が小さければ採用
GL_LEQUAL:元のアルファ値以下であれば採用
GL_EQUAL:元のアルファ値と同じであれば採用
GL_GREATER:元のアルファ値より値が大きければ採用
GL_NOTEQUAL:元のアルファ値と同じでなければ採用
GL_GEQUAL:元のアルファ値以上であれば採用
GL_ALWAYS:常に採用される

inserted by FC2 system