■ 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(
unsigned int w, unsigned int h, // Size
int fmt, // format ( RGB )
int type, // 型 ( U8 )
void *data // Pixel Data
);
DESC
CPU memory から FrameBuffer の PixelData に data を転送
( 読み込んだ画像を直接表示するときに利用する )
glRasterPos() で指定した位置に描画される
RasterPos が無効なら描画されない
POINT
glDrawPixels は以下の State の影響をうける
Pixel は 3D の描画と同じく Fragment の変換時に処理をうける
そのため Texture が有効なら 影響をうける
たいていは Default で問題なし
表示されない時は次の State を指定する
for( unsigned int 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 unsigned char[ w*h * sizeof(char) * 4 ];
for( unsigned int 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 int 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(
unsigned int w, unsigned int 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 );