基本事項
GL の原則
一度設定した 内容は 変更されるまで有効
State を保存する場所を Rendering Context という
WARNING
State の状態を正しく管理しないと, 想定しない動作に悩まされる
以下の方法をとる
[.] init 時に 頻繁に利用する State にする
[.] State を変更するときは 属性 Stack ( Push, Pop ) で囲む
[.] Module 設計, Object 指向 と合性が良い
変更する Code が責任をもって元の State に戻す
[.] Code が前提にしているものを取り除く
特定の State を前提にしている Code は他の Code を追加すると破壊されてしまう
[.] Code の再利用が簡単になる
描画命令の順
DESC
Command の発行順に描画される
Primitive 単位でも同じこと
glDrawElements();
clearcolor -> drawtri
drawtri -> clearcolor では 上塗りされる
TIP
matrix の順番も特に指定する必要なし( 現在のstate が描画時に反映 )
描画時とは begin() - end() の間
glMatrixMode( MV );
glMatrixMode( PROJ );
draw
glMatrixMode( PROJ );
glMatrixMode( MV );
draw
glMatrixMode( PROJ ); // これは既に有効ではない
透明に関しては以下の3種類
1. 不透明( 手前から, 塗りを減らすため )
3. クリップ( 奥から描画, αテストの部分が補間の関係でマージンができる為 )
2. 半透明( 奥から描画 )
glPushAttrib
SYNTAX
void glPushAttrib( GLbitfield );
DESC
指定した Group の属性を Stack に Push
利用してみたが, かなり効果的
1 Primitive 描画毎に Push, Pop してもいい
// 全部 保存
glPushAttrb( GL_ALL_ATTRIB_BITS );
glPopAttrib
glPushClientAttrib
glPopClientAttrib
State の設定 クエリ
glIsEnabled()
SYNTAX
bool glIsEnabled(
GLenum val
);
DESC
test whether a capability is enabled
glGet
DESC
OpenGL の実装依存の情報を取得する
( init 時にする )
問い合わせる型にあった関数を利用する
float m[16];
glGetFloatv( GL_MODELVIEW_MATRIX, m );
Stack を使って管理する
State の変更を管理するための stack( 属性スタック ) が Server, Client 側にある
glPushAttrb
SYNTAX
glPushAttrb(
GLbitfield mask
)
glPopAttrb();
// Material, Light 属性のみを Push する
glPushAttrb( GL_LIGHTING_BIT );
// そして元に戻す
glPopAttrb();
// Stack のサイズをしらべる
int nr;
glGetIntegerv( GL_MAX_ATTRIB_STACK_DEPTH, &nr );
開発環境
以下の Header, library が必要
[.] OpenGL Header, library
[.] Window System の Header, library
visualstudio.net には OpenGL 1.1 の Header と Export StubLibrary がふくまれる
// version 1.1 以降の機能, 拡張機能 を利用するには glext.h が必要
Microsoft Compiler は glu1.2 の header, StubLibrary を含む
用語
Primitive
DESC
Primitive とは 1 つ以上の 頂点のグループ
線の Primitive は 2 つ以上の頂点が必要。
プリミティブは頂点を組み立てることで生成される。