アンチエイリアス
ジャギをぼかす
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 | オプションを選択しない |
実装はこれらの設定を無視することもできます
そのため、この情報は実装に対する要求であり
何らかの動作を保障するものではありません