状態変数の管理
オブジェクトの状態
OpenGL は描画に関する様々な情報を状態変数として内部に保持しています
つまり、OpenGL は様々なプロパティを持ち、これを変更する手段を提供しているのです
状態変数は、特定の関数を使って制御できるため、スマートに制御することができます
OpenGL は驚くほど多くの状態変数を持っています
残念ながら、そのすべてをここで紹介し、意味を説明することは不可能です
しかし、それらを制御する方法については、比較的簡単に説明することができるでしょう
OpenGL では、状態変数を表す定数が定義されています
私たちは、この定数と値を組み合わせて状態変数を制御することができるのです
状態変数を得るには、次の関数のいずれかを使います
void glGetBooleanv(GLenum pname , GLboolean * params);
void glGetDoublev(GLenum pname , GLdouble * params);
void glGetFloatv(GLenum pname , GLfloat * params);
void glGetIntegerv(GLenum pname , GLint * params);
void glGetPointerv(GLenum pname, GLvoid ** params);
pname には取得する状態変数を示す定数を
params には取得するデータが格納される、指定した型の配列へのポインタです
一般には、これらの関数をまとめて glGet() 関数と呼ぶことがあります
pname に指定する定数は、数が多いためこの場ですべてを説明することはできません
必要に応じて、リファレンスを参照してください
例えば、現在の色は GL_CURRENT_COLOR で取得することができますし
カラーバッファの消去色は GL_COLOR_CLEAR_VALUE で得ることができます
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
GLfloat fore[4] , back[4];
void disp( void ) {
glClearColor(back[0] , back[1] , back[2] , back[3]);
glClear(GL_COLOR_BUFFER_BIT);
glColor3fv(fore);
glBegin(GL_TRIANGLES);
glVertex2f(0 , -0.9);
glVertex2f(-0.9 , 0.9);
glVertex2f(0.9 , 0.9);
glEnd();
glFlush();
}
int main(int argc , char ** argv) {
glutInit(&argc , argv);
glutInitWindowPosition(100 , 50);
glutInitWindowSize(400 , 300);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutCreateWindow("Kitty on your lap");
glutDisplayFunc(disp);
glGetFloatv(GL_CURRENT_COLOR , back);
glGetFloatv(GL_COLOR_CLEAR_VALUE , fore);
glutMainLoop();
return 0;
}
このプログラムは glutMainLoop() を呼び出す前に
デフォルトのカラーバッファの消去色と前景色を取得し、これを float 型配列に格納しています
ディスプレイ コールバックでは、これらの値を逆転させて描画を行っています
そのため、背景はしろ、頂点は黒で描画されるはずです
また、何らかの状態の ON/OFF を切り替えるようなこともしばしばあります
このようなブーリアン型の情報は glEnable() と glDisable() 関数を使います
void glEnable(GLenum cap);
void glDisable(GLenum cap);
cap には、特定機能を示すシンボル定数を指定します
glEnable() 関数はその機能を有効にし、glDisable() 関数は無効にします
cap に指定できる定数は、リファレンスを参照してください
有効状態は GL_TRUE で表され、無効状態は GL_FALSE で表されます
OpenGL では、GL_DITHER 以外はすべて無効状態 GL_FALSE になっていると定義されています
なぜならば、多くの機能は有効状態にすることによって負荷が大きくなるためです
機能が有効か無効かを知るためには glIsEnabled() 関数を使います
GLboolean glIsEnabled(GLenum cap);
関数は cap で指定した機能が有効ならば GL_TRUE を、そうでなければ GL_FALSE を返します