フォグ


背景に溶け込む

コンピュータ・グラフィックスは、細部まで明確に見えてしまうものです
CAD のようなソフトウェアは正確さを求められますが、一方で、
現実の空間をシミュレートする場合、明確すぎるのは困ることがあります

アンチエイリアスは鋭すぎる映像を滑らかにすることができましたが
広い空間を表現する場合は、大気効果を実現しなければならないでしょう
霧や雲などによって、視界を遮られている状態をシミュレートするのです
これを実現するには、フォグと呼ばれる機能を利用します

フォグを使えば、視点から離れたオブジェクトはフォグの色に溶け込むのです
この性質を利用すれば、オブジェクトが背景に溶け込むような演出が可能です
フォグを有効にするには glEnable() 関数に GL_FOG を渡すだけです

フォグがどのくらいのクオリティで実現されるかは glHint() 関数で指定できます
ただし、アンチエイリアス同様に、実装に依存する問題です
実際に、フォグの処理に使われる方程式を選択するには glFog() 関数を使います

void glFogf(GLenum pname , GLfloat param);
void glFogi(GLenum pname , GLint param);
void glFogfv(GLenum pname , const GLfloat * params);
void glFogiv(GLenum pname, const GLint * params);

pname には、設定するフォグのパラメータを指定します
ここで、フォグの色や開始位置などの属性を指定し
param で値を、pnames ならば値を格納したポインタを指定するのです
pname には以下の定数を指定することができます

定数解説
GL_FOG_MODEフォグの混合要素の計算に使用される等式を指定します
パラメータには GL_LINEAR、GL_EXP、GL_EXP2 のいずれかを指定します
初期値は GL_EXP です
GL_FOG_DENSITYフォグの指数方程式に使用するフォグ密度を指定します
パラメータには単独の整数、または浮動小数点値を指定します
初期値は 1 です
GL_FOG_STARTGL_LINEAR で使用する近景位置を指定します
パラメータには単独の整数、または浮動小数点値を指定します
初期値は 0 です
GL_FOG_ENDGL_LINEAR で使用する遠景位置を指定します
パラメータには単独の整数、または浮動小数点値を指定します
初期値は 1 です
GL_FOG_INDEXフォグのカラー指標を指定します
パラメータには単独の整数、または浮動小数点値を指定します
初期値は 0 です
GL_FOG_COLORフォグの色を指定します
パラメータは 4 つの整数、または浮動小数点値へのポインタを指定します
初期値は (0 , 0 , 0 , 0) です

GL_LINEAR フォグの方程式は最もシンプルで、平均的に溶け込みます
これに対し、GL_EXP、GL_EXP2 は密度を基に曲線的な溶け方になります
GL_LINEAR であれば GL_FOG_START と GL_FOG_END 属性が影響を与え
GL_EXP、GL_EXP2 であれば GL_FOG_DENSITY 属性が影響を与えます
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>

void disp( void ) {
	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_POLYGON);
		glVertex3f(0 , -0.9 , -2);
		glVertex3f(3 , -0.9 , -7);
		glVertex3f(0 , 0.9 , -2);

		glVertex3f(0 , -0.9 , -2);
		glVertex3f(-3 , -0.9 , -7);
		glVertex3f(0 , 0.9 , -2);
	glEnd();

	glFlush();
}

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

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

	glMatrixMode(GL_PROJECTION);
	glFrustum(1 , -1 , -1 , 1 , 2 , 10);

	glEnable(GL_FOG);
	glFogi(GL_FOG_MODE , GL_LINEAR);
	glFogi(GL_FOG_START , 2);
	glFogi(GL_FOG_END , 7);

	glutMainLoop();
	return 0;
}


このプログラムは、フォグをデフォルトの黒色で有効化しています
そのため、オブジェクトが奥に行けば行くほど、黒に溶け込むように見えるのです
フォグ方程式は GL_LINEAR を指定しているので、平均的に溶け込んでいますね



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