アンチエイリアス


ジャギをぼかす

OpenGL のデフォルトの描画では、線の精度が極めて低い状態です
これは、線を斜めに描画すればよくわかるでしょう
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>

void disp( void ) {
	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_LINES);
		glVertex2f(-0.9 , -0.9);
		glVertex2f(0.9 , 0.9);
	glEnd();

	glFlush();
}

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

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

	glutMainLoop();
	return 0;
}


線がギザギザになっているのがわかると思います
これをジャギと呼び、CG の問題のひとつです

ジャギは、線を描画するためのピクセル上の近似値を求めることによって発生します
この状態をエイリアスと呼びます
そして、これに対しジャギを解消する方法をアンチエイリアスと呼ぶのです

アンチエイリアスはピクセルの周辺に薄いピクセルを配置してぼかします
アンチエイリアス処理を行うには、まず、これを有効にしなければなりません
点は GL_POINT_SMOOTH、線は GL_LINE_SMOOTH
ポリゴンは GL_POLYGON_SMOOTH を使って glEnable() に指定します

次に、線をぼかすための処理を実現するために、混合処理を有効化します
アンチエイリアスは、アルファ値を使って線の周囲を覆う値を決定します
これで、ジャギをある程度解消することができるでしょう
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>

void disp( void ) {
	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_LINES);
		glVertex2f(-0.9 , -0.9);
		glVertex2f(0.9 , 0.9);
	glEnd();

	glFlush();
}

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

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

	glEnable(GL_LINE_SMOOTH);
	glLineWidth(10);

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

	glutMainLoop();
	return 0;
}


今度は、線のアンチエイリアス処理を有効にして描画してみました
上の図からはよくわからないかもしれませんが、実際に実行してみるか
もしくは、拡大してみると、ジャギが消えていることが確認できるでしょう
ただし、アンチエイリアス処理の計算は実行環境によっても異なります

アンチエイリアスの処理に使う計算は、多少の柔軟性を持っています
glHint() 関数を使って、クオリティを選択することができるのです

void glHint(GLenum target , GLenum mode);

target には、オプション選択を行う対象を指定します
ここには、次のいずれかを指定することができます

定数意味
GL_FOG_HINTファグ計算の精度を示します
GL_LINE_SMOOTH_HINTアンチエイリアス処理された線のサンプリングを示します
GL_PERSPECTIVE_CORRECTION_HINTカラーとテクスチャ座標の補間精度を示します
GL_POINT_SMOOTH_HINTアンチエイリアス処理された点のサンプリングを示します
GL_POLYGON_SMOOTH_HINTアンチエイリアス処理されたポリゴンのサンプリングを示します

mode には、対象のオプションを指定します
これで、品質と処理能力の妥協点を探ることができます
mode には以下の定数のいずれかを指定することができます

定数意味
GL_FASTEST最も効率的なオプション
GL_NICEST最も正確で、最高品質のオプション
GL_DONT_CAREオプションを選択しない

実装はこれらの設定を無視することもできます
そのため、この情報は実装に対する要求であり
何らかの動作を保障するものではありません



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