GLCOPYPIXELS
Section: Misc. Reference Manual Pages (3G)
索引
xjman
名前
glCopyPixels
- フレームバッファ内のピクセルをコピーする
書式
void glCopyPixels(
GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum type )
delim $$
引き数
- x, y
-
コピーする矩形ピクセル領域の左下隅のウィンドウ座標を指定する。
- width, height
-
コピーする矩形ピクセル領域の寸法を指定する。
どちらも 0 以上の値である。
- type
-
コピーするのが色の値、深さの値、ステンシル値のいずれであるのかを指定する。
シンボル定数
GL_COLOR,
GL_DEPTH,
GL_STENCIL
を指定できる。
説明
glCopyPixels は画面に並んだ矩形ピクセル領域を、
フレーバッファの指定位置から、現在のラスタ位置から相対指定した位置に
コピーする。
この操作がうまく定義されるのは、コピー元の領域全体が
ウィンドウの露出している部分に含まれている場合だけである。
ウィンドウの外からコピーした場合や、ウィンドウの露出していない部分から
コピーした結果は、ハードウェア依存となり未定義である。
x, y は、コピーする矩形領域の左下隅のウィンドウ座標
を指定する。
width と height は、コピーする矩形領域の
寸法を指定する。
width と height の値はどちらも 0 以上でなければならない。
いくつかのパラメータを使うと、
ピクセルデータがコピーされる際に加えられる処理を制御できる。
これらのパラメータは次の 3 つのコマンドで設定する:
glPixelTransfer,
glPixelMap,
glPixelZoom。
これら 3 つのコマンドのマニュアルページには、各コマンドで指定した
パラメータが glCopyPixels に与える効果の
ほとんど(ただし全部ではない)が説明されている。
glCopyPixels は、左下隅が (x + $i$, y + $j$)
である位置から各ピクセルの値をコピーする。
ここで 0 < $i$ < width, 0 < $j$ < height である。
このピクセルは、$j$th 行の $i$ 番目のピクセルと呼ばれる。
ピクセルは下の行から上の行へ向かう順、同じ行では左から右への順でコピーされる。
type は色、深さ、ステンシルのどのデータをコピーするのかを指定する。
各データ型について、転送の詳しい説明は次のようになる:
- GL_COLOR
-
現在の入力元バッファとして指定されているバッファから(glReadBuffer を参照)、
インデックス色または RGBA 色を読み込む。
GL が色インデックスモードの場合、
このバッファから読み出された各インデックスは固定小数点の値に変換される。
この際、2 進値の小数点から右のビット数は不定である。
次に各インデックスは GL_INDEX_SHIFT ビットだけ
左にシフトされ、さらに GL_INDEX_OFFSET の値が加えられる。
GL_INDEX_SHIFT が負の値の場合、シフトは右方向に行われる。
どちらの場合も、結果に含まれる値でビット値が不定となる部分は 0 で埋められる。
GL_MAP_COLOR が真の場合、インデックスが
色テーブルGL_PIXEL_MAP_I_TO_I 内で参照している値が
インデックス値と置き換えられる。
インデックスの参照置き換えが行われたかどうかにかかわらず、
次にインデックスの整数部分は $2 sup b -1$ との AND が取られる。
ここで $b$ は色インデックスバッファのビット数である。
-
GL が RGBA モードならば、読み出された各ピクセルの赤、緑、青、
アルファ値の要素は固定小数点値の内部データに変換される。
この値の精度は不定である。
この変換では、表現可能な最大の要素値が 1.0 にマップされ、
要素値 0 が 0.0 にマップされる。
この結果得られる浮動小数点の色値には、GL_c_SCALE が掛けられた
後、GL_c_BIAS が加えられる。
ここで c は、それぞれの色要素に対する赤、緑、青、アルファ値
である。
この結果は [0,1] の範囲に収まるように修正される。
GL_MAP_COLOR が真ならば、それぞれの色要素は
色参照テーブルの大きさ GL_PIXEL_MAP_c_TO_c でスケール変換され、
そのテーブルの中で参照されている値と置き換えられる。
ここで c は R, G, B, A のいずれかである。
-
実装が GL_ARB_imaging 機能拡張に対応している場合はさらに、
色テーブルの参照値、色行列変換、畳み込みフィルタで
色値を処理することもできる。
-
次に GL は、現在のラスタ位置の z 座標と
テクスチャ座標を各ピクセルに割り付け、
それからウィンドウ座標
($x sub r ~+~ i , y sub r ~+~ j$)
を割り当てることにより、結果として得たインデックスまたは RGBA 色を
フラグメントに変換する。
ここで ($x sub r , y sub r$) は現在のラスタ位置であり、
ピクセルは $j$ 行目の $i$ 番目のピクセルである。
これらのピクセルフラグメントは、それから
点、線、ポリゴンのラスタ処理によって作られたフラグメントと
同じように扱われる。
テクスチャマッピング、フォグ処理や全てのフラグメント操作は
フラグメントがフレームバッファに書き込まれる前に行われる。
- GL_DEPTH
-
深さ値はデプスバッファから読み出され、直接内部形式の
浮動小数点値に変換される。この値の精度は不定である。
結果として得られる浮動小数点値の深さ値には、次に
GL_DEPTH_SCALE が掛けられ、それから GL_DEPTH_BIAS
が加えられる。
結果は [0,1] の範囲に収まるように修正される。
-
GL は次に、現在のラスタ位置の色または色インデックスおよび
テクスチャ座標を各ピクセルに割り付け、
それからウィンドウ座標 ($x sub r ~+~ i , y sub r ~+~ j$) を
割り当てることにより、この結果の深さ要素値をフラグメントに変換する。
ここで ($x sub r , y sub r$) は現在のラスタ位置であり、
ピクセルは $j$ 行目の $i$ 番目のピクセルである。
これらのピクセルフラグメントは、それから
点、線、ポリゴンのラスタ処理によって作られたフラグメントと
同じように扱われる。
テクスチャマッピング、フォグ処理や全てのフラグメント操作は
フラグメントがフレームバッファに書き込まれる前に行われる。
- GL_STENCIL
-
ステンシルのインデックスをステンシルバッファから読み、
内部形式の固定小数点値に変換する。
この値の、2 進数の小数点より右のビット数は不定である。
固定小数点値のインデックスのそれぞれは、次に GL_INDEX_SHIFT ビット
だけ左にシフトされ、それから GL_INDEX_OFFSET を加えられる。
GL_INDEX_SHIFT が負の値の場合は、シフトは右方向に行われる。
どちらの場合も、結果の値の中でビット値が不定となる位置は 0 で
埋められる。
GL_MAP_STENCIL が真ならば、インデックス値は、
このインデックスが参照テーブル GL_PIXEL_MAP_S_TO_S の中で
参照している値と置き換えられる。
インデックスの参照値との置き換えが行われたかどうかにかかわらず、次に
インデックスの整数部分は $2 sup b -1$ との AND が取られる。
ここで $b$ はステンシルバッファ内でのビット数である。
次に、結果として得られるステンシルのインデックスがステンシルバッファ
に書き込まれる。この結果を使って、
$j$ 行目の $i$ 番目のピクセル位置から読み出されたインデックスが
位置 ($x sub r ~+~ i , y sub r ~+~ j$) に書き込まれる。
ここで ($x sub r , y sub r$) は現在のラスタ位置である。
これらの書き込み操作に影響を与えるのは、ピクセルの所有者のテスト、
シザーテスト、ステンシルの書き込みマスクだけである。
ここまで述べたラスタライズ処理では、ピクセルの拡大係数を
1.0 と仮定している。
glPixelZoom を使って $x$, $y$ の拡大係数を
変えた場合には、ピクセルは次のようにフラグメントに変換される。
($x sub r$, $y sub r$) を現在のラスタ位置とし、指定されたピクセルが
入力となる矩形領域のピクセル $j$ 行目の $i$ 番目のピクセルだと
すると、
($x sub r ~+~ zoom sub x^ i$, $y sub r ~+~ zoom sub y^j$)
および
($x sub r ~+~ zoom sub x^ (i ~+~ 1)$, $y sub r ~+~ zoom sub y^ ( j ~+~ 1 )$)
が隅となる矩形領域に中心があるピクセルに対してフラグメントが作られる。
ここで $zoom sub x$ は GL_ZOOM_X の値であり、
$zoom sub y$ は GL_ZOOM_Y の値である。
実行例
ウィンドウの左下隅にある色ピクセルを現在のラスタ位置にコピーするには
glCopyPixels(0, 0, 1, 1, GL_COLOR);
を使う。
注意
glPixelStore で指定するモードは、glCopyPixels の動作には
影響を与えない。
エラー
GL_INVALID_ENUM:
type の値が不正な場合に起こる。
GL_INVALID_VALUE:
width または height の値が負の場合に起こる。
GL_INVALID_OPERATION:
type が GL_DEPTH であり、かつデプスバッファがない場合に起こる。
GL_INVALID_OPERATION:
type が GL_STENCIL であり、かつステンシルバッファがない場合に起こる。
GL_INVALID_OPERATION:
glBegin と、その対になる glEnd の間で
glCopyPixels が実行されると起こる。
関連する取得値
引き数に GL_CURRENT_RASTER_POSITION を指定した glGet
引き数に GL_CURRENT_RASTER_POSITION_VALID を指定した glGet
関連項目
glColorTable(3G),
glConvolutionFilter1D(3G),
glConvolutionFilter2D(3G),
glDepthFunc(3G),
glDrawBuffer(3G),
glDrawPixels(3G),
glMatrixMode(3G),
glPixelMap(3G),
glPixelTransfer(3G),
glPixelZoom(3G),
glRasterPos(3G),
glReadBuffer(3G),
glReadPixels(3G),
glSeparableFilter2D(3G),
glStencilFunc(3G)
Index
- 名前
-
- 書式
-
- 引き数
-
- 説明
-
- 実行例
-
- 注意
-
- エラー
-
- 関連する取得値
-
- 関連項目
-
Time: 07:01:06 GMT, January 12, 2009