ホームに戻る
 ピクセル操作

図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 を適用。

inserted by FC2 system