デプスバッファ

2010年1月6日

ファイル

20-depth.tar.gz

使い方

キーボードのキー "d" で、デプステストのオン・オフが切り替わります。

見所

赤と緑の多角形があります。位置としては赤が緑の前にあって、その間を中心として回転しています。描画は赤が先、緑が後になっています。本来なら、赤が前に来たり緑が前に来たりするのですが、デプステストなしでは描画が上書きされるので、後に描かれる緑が常に前に来ます。デプステストありなら、位置として手前にあるはずの赤に緑は上書きしませんので、ちゃんと赤と緑が交互に前に来るように表示されます。

内容

2 つの多角形を描画しています。

	glPushMatrix();
	glTranslatef(-0.25, 0., 1.);
	glColor3f(1., 0., 0.);
	drawPolygon();
	glPopMatrix();

	glPushMatrix();
	glTranslatef(0.25, 0., -1.);
	glColor3f(0., 1., 0.);
	drawPolygon();
	glPopMatrix();

はじめの目の位置 (0, 0, 2.5) から見て、赤い多角形が手前、緑の多角形が後ろにあります。描画は赤が先、緑が後になっています。OpenGL は先に指定されたものはそのまま先に描画しますので、このままだと赤を描画し、その上から緑を描画します。つまり、2 つの図形をその間を中心として回転させても、常に緑が手前にあるように見えます。この問題を解決するために、デプスバッファを使います。

デプスバッファは、ピクセルごとに描画されたものの視点からの位置を記憶します。これを使って、あるピクセルへの描画処理が発生したとき、描画しようとするものがすでに描画されているものよりも視点から見て手前にあるならば上書きし、視点から見て後ろにあるならば描画しない、という判断が可能になります。次の図のようなイメージです。セルの中の数字が視点からの距離を表わすものとします。

デプスバッファを使用するには、ディスプレイモードを以下のように指定します。

	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

上書き描画するかどうかのチェックをするようにするには、デプステストを有効にします。

	if(depth) glEnable(GL_DEPTH_TEST);

ここでは、変数の値に応じてデプステストのオン・オフを切り替えています。一度有効にしたデプステストを無効にするのは以下の行です。

	glDisable(GL_DEPTH_TEST);

画面のクリアは色に対してだけ行っていましたが、デプスバッファを使う場合はデプスバッファのクリアの指定も必要です。

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

OpenGL プログラミング 目次へ