混合処理


透過とアルファ値

オブジェクトの色を指定するとき glColor4f() 関数などを使って
RGBA 形式でアルファ値を指定することができました
このアルファ値は、混合処理を有効化したときに影響を与えます

混合処理は、画面のピクセルの色に新しい色を組み合わせる処理です
混合処理を使用しない場合は、新しい色が現在のピクセルの色を上書きします
しかし、混合処理が有効になっていれば、後ろの色が透けて見えるのです
例えば、色つきのガラス窓から外を描写するグラフィックに必要になるでしょう

まず、混合処理を有効にするには glEnable() 関数に GL_BLEND を指定します
次に glBlendFunc() 関数を使って演算方法を指定します
これによって、新しい色と現在の色をどのように組み合わせるかを決定します

void glBlendFunc(GLenum sfactor , GLenum dfactor);

sfactor には新しい色の、dfactor には現在の色の計算方法を指定します
ここには、次の定数のいずれかを指定することができます

定数(fR,fG,fB,fA)
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/kR,Gd/kG,Bd/kB,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)

s と d はそれぞれ源泉色(新しい色)と対象色(現在の色)のRGBAを表します
源泉色は (Rs, Gs, Bs, As)、対象色は(Rd, Gd, Bd, Ad) で表します
これらは、(mR, mG, mB, mA) がビットプレーンの数とすると
kc=2mc-1 によって導かれる 0 と (kR, kG, kB, kA) の間の整数です
i は i=min(As, kA-Ad) / kA を表しています

これらの係数をうまく使えば、様々な混合処理を実現することができます
画像の重ね合わせや、段階的な色の加算処理などが可能になるでしょう
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>

int width , height;
void Draw(void);
void Draw() {
	glBegin(GL_TRIANGLES);
		glVertex2f(-0.9 , -0.9);
		glVertex2f(0.9 , -0.9);
		glVertex2f(0 , 0.9);
	glEnd();

	glViewport(0 , 0 , width , height);
}

void disp( void ) {
	glClear(GL_COLOR_BUFFER_BIT);

	glPushMatrix();
		glColor4f(1 , 0 , 0 , 0.7);
		glTranslatef(-0.5 , 0 , 0);
		Draw();
	glPopMatrix();
	glPushMatrix();
		glColor4f(0 , 0 , 1 , 0.5);
		glTranslatef(0.5 , 0 , 0);
		Draw();
	glPopMatrix();

	glFlush();
}

void reshape(int w , int h) {
	width = w; height = h;
	disp();
}

int main(int argc , char ** argv) {
	glutInit(&argc , argv);
	glutInitWindowSize(400 , 300);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

	glutCreateWindow("Kitty on your lap");
	glutDisplayFunc(disp);
	glutReshapeFunc(reshape);

	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA , GL_ONE);

	glutMainLoop();
	return 0;
}


このプログラムは混合処理を有効にして2つの三角形を描画しています
青い三角形を描画した時、後ろの赤い三角形を上書きするピクセルが存在します
通常は青で塗りつぶされますが、アルファ値にしたがって透過しています



前のページへ戻る次のページへ