ホームに戻る
ピクセル操作
図10_00:三角形は下端が最前面、上が最後面に位置 デプスバッファ値を赤チャンネルで表示
ソースコード:glut10_pixels.c
解説
ダブルバッファ
ダブルバッファとは表と裏で2枚のバッファを持ち。
裏に描画し表と交換することで表示を行うこと。
使い方は glutInitDisplayMode で GLUT_DOUBLE のビットをたてる。
ダブルバッファを指定しないと GL_FRONT が通常のバッファであり、
指定すると GL_FRONT と GL_BACK の2枚で GL_BACK が通常のバッファとなる。
表示は glFlush で GL_FRONT を表示し、
ダブルバッファで GL_BACK を表示したい場合は glutSwapBuffers を呼ぶ。
glutSwapBuffers で GL_FRONT と GL_BACK を入れ替えて表示を行う。
glutSwapBuffers は内部で glFlush を呼ぶため glFlush を書く必要は無い。
描画する対象のバッファは glDrawBuffer で
GL_FRONT と GL_BACK から選択でき、
読みこむ対象のバッファも glReadBuffer で選択できる。
その他に汎用のバッファとして GL_AUXi (i は 0 から始まる数字)
があり glGetIntegerv で第1引数に GL_AUX_BUFFERS を指定すると、
利用できるバッファ数を第2引数の int 値のアドレスに入れる。
glReadPixels
glReadPixels はバッファより値を自作のメモリ配列に読み込む。
読みこむ対象のバッファは glReadBuffer で選択する。
第1、2引数には読み込む位置 (x, y) を指定。画面の左下が (0, 0)。
第3、4引数には読み込むピクセルの幅と高さを指定。
第5引数には読み込むデータの種類。
GL_COLOR_INDEX:インデックスカラー値
GL_STENCIL_INDEX:ステンシルバッファ値
GL_DEPTH_COMPONENT:デプスバッファ値
GL_RED:赤チャンネル値
GL_GREEN:緑チャンネル値
GL_BLUE:青チャンネル値
GL_ALPHA:アルファチャンネル値
GL_RGB:赤、緑、青チャンネル値
GL_RGBA:赤、緑、青、アルファチャンネル値
GL_BGR_EXT:青、緑、赤値
GL_BGRA_EXT:青、緑、赤、アルファチャンネル値
GL_LUMINANCE:赤、緑、青チャンネルの合計値
GL_LUMINANCE_ALPHA:赤、緑、青チャンネルの合計値、アルファチャンネル値
第6引数には読み込むデータを入れる配列のデータ型。
GL_UNSIGNED_BYTE
GL_BYTE
GL_BITMAP
GL_UNSIGNED_SHORT
GL_SHORT
GL_UNSIGNED_INT
GL_INT
GL_FLOAT
第7引数には読み込むデータを入れる配列の先頭ポインタ。
この配列には例えば GL_RGB のデータを GLfloat で入れるなら、
縦サイズ×横サイズ×3(R、G、B)×sizeof(GLfloat) が必要になる。
glPixelStore
glPixelStore でメモリへの格納法が指定できます。
整数値の場合 glPixelStorei、浮動小数値の場合 glPixelStorefを使う。
第1引数で方法を、第2引数でパラメーターを指定。
GL_PACK_SWAP_BYTES:GL_TRUE でバイト単位でスワップを行う。
GL_PACK_LSB_FIRST:GL_TRUE でリトルエンディアンを想定する。
GL_PACK_ROW_LENGTH:1行のピクセル数を指定する。( 0 で無効)
GL_PACK_SKIP_PIXELS:最初に指定したピクセル数ぶんのブランクを作ります。
GL_PACK_SKIP_ROWS:最初に指定した行数ぶんのブランクを作ります。
GL_PACK_ALIGNMENT:アラインメントを 1, 2, 4, 8 から指定。
特に重要なのは GL_PACK_ROW_LENGTH と GL_PACK_ALIGNMENT の組み合わせ。
この数値次第で1行が要するメモリの量が変わってきます。
初期値は以下の通り、
GL_PACK_SWAP_BYTES:GL_FALSE
GL_PACK_LSB_FIRST:GL_FALSE
GL_PACK_ROW_LENGTH:0
GL_PACK_SKIP_PIXELS:0
GL_PACK_SKIP_ROWS:0
GL_PACK_ALIGNMENT:4
glPixelStore では取り出す方法も指定できます。
GL_UNPACK_SWAP_BYTES:GL_TRUE でバイト単位でスワップを行う。
GL_UNPACK_LSB_FIRST:GL_TRUE でリトルエンディアンを想定する。
GL_UNPACK_ROW_LENGTH:1行のピクセル数を指定する。( 0 で無効)
GL_UNPACK_SKIP_PIXELS:最初に指定したピクセル数ぶんのブランクを作ります。
GL_UNPACK_SKIP_ROWS:最初に指定した行数ぶんのブランクを作ります。
GL_UNPACK_ALIGNMENT:アラインメントを 1, 2, 4, 8 から指定。
初期値は以下の通り、
GL_UNPACK_SWAP_BYTES:GL_FALSE
GL_UNPACK_LSB_FIRST:GL_FALSE
GL_UNPACK_ROW_LENGTH:0
GL_UNPACK_SKIP_PIXELS:0
GL_UNPACK_SKIP_ROWS:0
GL_UNPACK_ALIGNMENT:4
データの移動に際しては、
glPixelTransfer と glPixelMap によって数値を修正することができます。
glPixelTransfer
glPixelTransfer はまずデータが 0-1 に切り詰められてから処理されます。
第1引数が方法で、第2引数がパラメーターです。
GL_MAP_COLOR:GL_TRUE でカラーマップを有効に。
GL_MAP_STENCIL:GL_TRUE でステンシルマップを有効に。
GL_INDEX_SHIFT:右シフトしブランクは 0 で埋めます。
GL_INDEX_OFFSET:GL_INDEX_SHIFT の後に足される値。
GL_RED_SCALE:赤チャンネル値にかけられる値。
GL_GREEN_SCALE:緑チャンネル値にかけられる値。
GL_BLUE_SCALE:青チャンネル値にかけられる値。
GL_ALPHA_SCALE:アルファチャンネル値にかけられる値。
GL_DEPTH_SCALE:デプスバッファ値にかけられる値。
GL_RED_BIAS:GL_RED_SCALE の後に足される値。
GL_GREEN_BIAS:GL_GREEN_SCALE の後に足される値。
GL_BLUE_BIAS:GL_BLUE_SCALE の後に足される値。
GL_ALPHA_BIAS:GL_ALPHA_SCALE の後に足される値。
GL_DEPTH_BIAS:GL_DEPTH_SCALE の後に足される値。
初期値リスト、
GL_MAP_COLOR:GL_FALSE
GL_MAP_STENCIL:GL_FALSE
GL_INDEX_SHIFT:0
GL_INDEX_OFFSET:0
GL_RED_SCALE:1.0
GL_GREEN_SCALE:1.0
GL_BLUE_SCALE:1.0
GL_ALPHA_SCALE:1.0
GL_DEPTH_SCALE:1.0
GL_RED_BIAS:0.0
GL_GREEN_BIAS:0.0
GL_BLUE_BIAS:0.0
GL_ALPHA_BIAS:0.0
GL_DEPTH_BIAS:0.0
glPixelMap
glPixelTransfer が処理されると再び数値が 0-1 に切り詰められます。
GL_MAP_COLOR か GL_MAP_STENCIL が有効であれば glPixelMap を処理します。
第1引数は移動方向の指定、
GL_PIXEL_MAP_I_TO_I:インデックスカラーからインデックスカラーへ
GL_PIXEL_MAP_S_TO_S:ステンシルバッファ値からステンシルバッファ値へ
GL_PIXEL_MAP_I_TO_R:インデックスカラーから赤チャンネルへ
GL_PIXEL_MAP_I_TO_G:インデックスカラーから緑チャンネルへ
GL_PIXEL_MAP_I_TO_B:インデックスカラーから青チャンネルへ
GL_PIXEL_MAP_I_TO_A:インデックスカラーからアルファチャンネルへ
GL_PIXEL_MAP_R_TO_R:赤チャンエルから赤チャンネルへ
GL_PIXEL_MAP_G_TO_G:緑チャンエルから緑チャンネルへ
GL_PIXEL_MAP_B_TO_B:青チャンエルから青チャンネルへ
GL_PIXEL_MAP_A_TO_A:アルファチャンエルからアルファチャンネルへ
第2引数はマップのサイズ、第3引数はマップの先頭ポインタとなります。
例としてサイズが 3 の {0.3, 0.8, 1.0} というマップを考えます。
このとき元のデータに対して値の小さいものに 0.3、
大きいものに 1.0、その中間に 0.8 という値を割り振ることになります。
ディフォルトの設定は全てサイズが 1 の {0.0} というマップであるため、
マップを有効にすると元データは全て 0.0 に変換されます。
glDrawPixels
glDrawPixels は自作のメモリ配列よりデータを読み込み描画します。
描画するバッファは glDrawBuffer で指定します。
第1、2引数は描画する幅と高さ。
第3引数には描画するデータの種類。
GL_COLOR_INDEX:インデックスカラー値
GL_STENCIL_INDEX:ステンシルバッファ値
GL_DEPTH_COMPONENT:デプスバッファ値
GL_RED:赤チャンネル値
GL_GREEN:緑チャンネル値
GL_BLUE:青チャンネル値
GL_ALPHA:アルファチャンネル値
GL_RGB:赤、緑、青チャンネル値
GL_RGBA:赤、緑、青、アルファチャンネル値
GL_BGR_EXT:青、緑、赤値
GL_BGRA_EXT:青、緑、赤、アルファチャンネル値
GL_LUMINANCE:赤、緑、青チャンネルの合計値
GL_LUMINANCE_ALPHA:赤、緑、青チャンネルの合計値、アルファチャンネル値
第4引数には読み込むデータを入れる配列のデータ型。
GL_UNSIGNED_BYTE
GL_BYTE
GL_BITMAP
GL_UNSIGNED_SHORT
GL_SHORT
GL_UNSIGNED_INT
GL_INT
GL_FLOAT
第5引数には読み込むデータが入った配列の先頭ポインタ。
このままでは描画位置の指定が無いが、
この位置は glRasterPos で指定する。
ここで注意するのは3次元上の左下の位置を指定するということ。
glReadPixels は3次元を2次元の配列に入れたが、
glDrawPixels は2次元のデータを3次元に表示することになる。
glDrawPixels の際にも glPixelTransfer と glPixelMap の評価がある。
また、glPixelZoom がこの後に適用されると、
第1、2引数で指定しただけ x 方向、y 方向に描画を引き伸ばすことができる。
glCopyPixels
glCopyPixels は自作のメモリ配列を指定しない。
glReadBuffer と glDrawBuffer で読み込み元と描画先を指定できる。
glReadBuffer と glDrawBuffer で同じ値も有効。
glPixelTransfer、glPixelMap、glPixelZoom の適用がある。
ピクセル変換のまとめ、
1、0 より小さい数値は 0 に、1 より大きい数値は 1 に。
2、glPixelTransfer により掛け算、その後足し算の修正を行う。
3、0 より小さい数値は 0 に、1 より大きい数値は 1 に。
4、GL_MAP_COLOR か GL_MAP_STENCIL が真の場合、glPixelMap を適用。
5、glDrawPixels か glCopyPixels の場合、glPixelZoom を適用。