REFERENCE(リファレンス)




glColorMask

SYNTAX glColorMask() DESC framebuffer の書き込み制御 TRUE : ON FALSE : 描画 OFF ( 黒が MASK )
■□■■



glRasterPos

SYNTAX void glRasterPos[234][sidf]( TYPE x, TYPE y, TYPE z, TYPE w ); DESC RaterPos( Screen 上に描画する bitmap の位置 ) を指定する POINT glRasterPos で指定した位置は VertexTransform の影響をうける 3D 空間での glVertex と同様に考えればいい RasterPos は次の変換をうける
ObjectSpace ---> ClipSpace ---> WindowSpace ClipingVolume 内にある場合のみ WindowSpace へ変換される
// glVertex2f() と同じく Texcoord の影響をうける glRasterPos2f( 1, 1 ); // z = 0, w = 1 としての扱われる glRasterPos4f( 1, 1, 0, 1 );
POINT 最も初期の FrameBuffer は HostMemory ( Application から直接参照できる Memory ) に格納されていた


glDrawPixels

SYNTAX void glDrawPixels( u32 w, u32 h, // Size s32 fmt, // format ( RGB ) s32 type, // 型 ( U8 ) void *data // Pixel Data ); DESC CPU memory から FrameBuffer の PixelData に data を転送 ( 読み込んだ画像を直接表示するときに利用する ) glRasterPos() で指定した位置に描画される RasterPos が無効なら描画されない POINT glDrawPixels は以下の State の影響をうける Pixel は 3D の描画と同じく Fragment の変換時に処理をうける そのため Texture が有効なら 影響をうける たいていは Default で問題なし
[.] ByteOrder [.] 行の Alignment Default では 各行 が 4 Byte Alignment であることを要求 変更するには glPixelTranser() を使用 [.] ColorTable Lookup [.] PixelZoom
表示されない時は次の State を指定する
for( u32 i=0; i<8; i++ ){ glActiveTexture( GL_TEXTURE0 + i ); glDisable( GL_TEXTURE_1D ); glDisable( GL_TEXTURE_2D ); glDisable( GL_TEXTURE_3D ); glDisable( GL_TEXTURE_CUBE_MAP ); } // Fragment へ変換する際の FOG Color の着色 glDisable( GL_FOG ); glDisable( GL_DEPTH_TEST );
さらに Window の一部 が 別の Window に隠されている時も問題になる OpenGL が 隠された 領域から Pixel Data を返せるかどうかは Window System に依存する
POINT
format Pixel が何を表すか GL に伝える 色なら GL_RGBA Depth なら GL_DEPTH_COMPONENT type Pixel の Data 型 GL の立場で考えれば この情報は必然 data の先頭は void * でもらうため
App::init() { glClearColor( 1, 0.7f, 1, 1 ); data = new u8[ w*h * sizeof(char) * 4 ]; for( u32 i=0; i<w*h; i++ ){ data[4*i + 0] = 255; data[4*i + 1] = 255; data[4*i + 2] = 0; data[4*i + 3] = 255; } // 画面 size float W = 1024.0f; float H = W/2; // ModelView 変換はしない glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); // 画面 size の大きさになるように Frustum を作成 glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( 0, W, 0, H, 1, 1000 ); // 影響のある TEST を OFF にする // Rasterize 後の FragmentTest で不合格にならないように glDisable( GL_DEPTH_TEST ); // Fragment 変換時に 不要な色がつかないように glDisable( GL_TEXTURE_2D ); glDisable( GL_FOG ); glDisable( GL_BLEND ); } void App::Draw() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); static s32 cnt = 900; float y = 100; // x < 0 になると消える glRasterPos3f( (--cnt), y, -1.5f ); // Z も Frustum にはいるように // RasterPos が有効かチェックする { GLboolean ret; glGetBooleanv( GL_CURRENT_RASTER_POSITION_VALID, &ret ); psc( "raster pos vaiid %d", ret ); } glDrawPixels( w, h, GL_RGBA, GL_UNSIGNED_BYTE, data ); }
TIP TextureObject を利用した方が処理が早い EXT:GL_ARB_pixel_buffer_object により高速化可能 如何に処理負荷がかかるかわかる WARNING glRasterPos() は VertexTransform の影響をうける MV = UNIT, Frustum == Window の時に同一の場所になる. glWindowPos() VER1.4 で直接指定可能. Rasterize 時の State の影響もうける. Tex OFF DepthTest


glBitmap

SYNTAX void glBitmap( u32 w, u32 h, // 画像の大きさ float x, float y, // 開始位置 offset float xinc, float yinc,// 描画後 の RasterPos の移動量( WindowSpace ) byte *data ); DESC 大きさ w, h の bimap ( 1pixel 1 bit 画像 )を x, y の位置から 現在の RasterPos に data を描画 描画後 は xinc, yinc だけ RasterPos が移動する POINT 本来は txt を描画するために利用したが, RasterPos を移動するのに利用する
// "有効な位置" を指定する glRasterPos( ) // glBitmap() で RasterPos を移動して "有効な位置" からずれても問題なし glBitmap()



glWindowPos

SYNTAX void glWindowPos[23][sifd]( type x, type x, type z ); VER 1.4 DESC RasterPos を WindowSpace で指定する VertexTransform をバイパスする WARNING Symbol が見つからないため 中止


glClientActiveTexture

SYNTAX void glClientActiveTexture( GLenum unitTex ); DESC VertexArray の tc をわりあてる, UnitTex を指定する. TIP MultiTex && VertexArray の組あわせで使う


glDepthMask

SYNTAX void glDepthMask( bool flag ); DESC 指定した Buffer の書き込み Mask を設定する. はいってくる Fragment に対して, 指定した bit と && 操作する. なので, glDepthMask( true ); -> Depth 値が Buffer に書き込まれる. TIP glColorMask( bool red, bool, grn, bool blu, bool alp ); glStencilMask( int mask );


glFinish

SYNTAX void glFinish() DESC コマンドが完全に実行されるまで制御を返さない( BlockAPI ) 発行済みコマンドを強制実行し、グラフィックス ハードウェアやネットワークが コマンドの効果が現れた(描画を終了した)ことを保障した時点で制御が戻ります [GPU]---> おわったよ ----> [CPU] 処理の同期をとる際に利用する たとえば, 2D 表示を別の PostScript などでする場合. 先に 3次元処理を終了しておく. WARNING 同期まちをするので, 過度の使用は APP の処理速度をおとす( 特に Network 経由の場合 ) 基本的に glFlush() を利用すること。


glFlush

SYNTAX void glFlush() 発行した OpenGL コマンドの実行を強制するという方法が用いられます Flush == 送り出す. [ 有限時間内 ]に終了することが保障される 今の FW では CMyGL::flip() で SwapBuffers( hDC ); をしている App::Draw() の最後. もし Flush ならば, 処理待ちはしていないことになる. 消すとまったく表示されなくなる. しかし App::update() は正しい。 SwapBuffers の前に glFinish() を読んでも動作は OK の. コマンドを発行したからといって、サーバーが描画を終了しているとは限らないのです ClientServerModel だから, Newwork 経由で毎度命令データを送るわけではない. でも促したい場合もある そういう場合は, Flush する( 送り出す ) Graphics 処理は PIPELINE 方式である. POINT [CPU] : 描画CMD 発行. : ( 各 CMD の終了をまつ必要なし ) [GPU] : 専用の HW で処理.: CPU が送り出した 頂点を次々に処理する -> というわけで, CPU は 各 CMD ごとに GPU の処理を待つ必要はない. さて [CPU] <-> [GPU] が Network ではなれていた場合, 描画 CMD をひとつずつ送るのは、大変 OverHead がかかる. -> よって, NetworkProgram は CMD を NetworkPacket にまとめる。 しかし [ 1Frame の描画 CMD の発行が終了した ]際は, 強制的に送ってほしい. Network をはさまない場合は, CMD 発行と同時に即時処理される 次のケースでは glFlush() が有効. 各 Frame の最後で, 残りの CMD をすべて送り出す保障をする. SystemMemory に描画する SoftwareRenderer で 明示的に描画する際.


glClearColor

SYNTAX void glClearColor( float r, float g, float b, float a ); DESC glClear に使用する Color を設定する [0-1] に clamp される POINT 指定した Alpha 成分も, Clear() するとその値に FrameBuffer の Alpha 成分がなる Shader, glCopyTexImage2D, Blend 時はこの Alpha 成分を利用することになる FragmentShader で Fragment.w の値を指定すると Blend State で以下の影響をうける
DST( FrameBuffer) + SRC( Fragment )
WARNING FrameBuffer に Alpha 成分がなければ Alpha 成分は無視される TIP Alpha も設定できることに注目 glCopyTexImage2D() では Alpha 成分も Copy できる


glClear

SYNTAX void glClear( GLbitfield mask ) DESC Frame Buffer をクリアする Application は 各 frame の最初に color Buffer と DepthBuffer をクリアする TIP 一度の 呼び出しで 複数の Buffer をクリアすると高速
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );