OpenGL:属性グループ(glPushAttrib)

opengl-attribute-group.png

概要

いちいち、glEnable()…glDisable()するよりも
glPushAttrib()…glPopAttrib()で属性スタックに保存した方が効率的らしい、ということで調べてみた。

関連する状態変数群の値を、単一コマンドを使用して保存し、元に戻すことができる。
状態って??
状態とは今「ライティングが有効な状態」、とか「デプステストが有効な状態」そういう状態のこと。
OpenGLでは、関連する状態変数群を一つの属性グループ(attribute group)にグループ化出来る。
glPushAttrib()glPopAttrib()コマンドを用いると、5つの状態変数全てを一度に保存したり、戻したり出来る。
行列のglPushMatrix()とglPopMatrix()と同じように。
たとえば、
全体を描いてから細部を描き、また全体の世界に戻りたい、という場合とかね。
glPushClientAttrib()っていうのもあるらしいけど、クライアントって?→クライアント・サーバーモデルとしてのOpenGL
どうやらネットワークを介してOpenGLを使うときに使うようだな。今は関係ないか。
最大16個の属性グループが保存できるらしい。
実際に自分のコンピュータがどのくらいの属性グループが保存できるかどうかは次のコードで確認できる

glGetIntegerv(GL_MAX_CLIENT_ATTRIB_STACK_DEPTH,int配列のポインタ);

あるいは

glGetIntegerv(GL_MAX_ATTRIB_STACK_DEPTH,int配列のポインタ);

どんな時につかう?

設定する属性がいっぱいになってややこしくなったとき???

やり方

有効化する

glPushAttrib(GL_CURRENT_BIT);//これまでに設定した色を保存

無効化する

glPopAttrib();

たとえば、

こんな複雑な設定を。。。 こんなにすっきり!
glEnable(GL_LINE_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);
....
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_DEPTH_TEST);
glPushAttrib(GL_COLOR_BUFFER_BIT|GL_ENABLE_BIT|GL_HINT_BIT);
......
glPopAttrib();

サンプルコード

attrib.PNG
Attributeのサンプルコード

保存可能な属性のグループ一覧

  • GL_ACCUM_BUFFER_BIT
  • GL_ALL_ATTRIB_BITS….これは特殊で、全属性グループ内の全ての状態変数を保存し、元に戻すのに使用する。
  • GL_COLOR_BUFFER_BIT
  • GL_CURRENT_BIT
  • GL_DEPTH_BUFFER_BIT
  • GL_ENABLE_BIT
  • GL_EVAL_BIT
  • GL_HINT_BIT
  • GL_LIGHTING_BIT
  • GL_LINE_BIT
  • GL_LIST_BIT
  • GL_MULTISAMPLE_BIT
  • GL_PIXEL_MODE_BIT
  • GL_POINT_BIT
  • GL_POLYGON_BIT
  • GL_POLYGON_STIPPLE_BIT
  • GL_SCISSOR_BIT
  • GL_STENCIL_BUFFER_BIT
  • GL_TEXTURE_BIT
  • GL_TRANSFORM_BIT
  • GL_VIEWPORT_BIT

詳しくはOpenGL:属性グループ対応表で!
属性グループはこれで全部ではない。
他にも

  • vertex-array

attribute opengl-deprecated

サポートサイト Wikidot.com attributeopengl-deprecated