フレームバッファオペレーションでは、フレームバッファに対する読み込み、コピーなどの処理が行われます。
3DS では、対応している機能が以下のように制限されています。
-
glDrawBuffer()
は実装されていません。 -
glReadBuffer()
は実装されていません。 -
glDrawPixels()
は実装されていません。 -
glReadPixels()
はカラーバッファ、デプスバッファ、ステンシルバッファの内容を取得することができます。 -
glCopyPixels()
は実装されていません。 -
glPixelStore*()
は実装されていません。
14.1. リードピクセル
フレームバッファに関連付けられているレンダーバッファ(カラーバッファ、デプスバッファ、ステンシルバッファ)の内容を、glReadPixels()
でメモリに取り込むことができます。デプスバッファとステンシルバッファの内容を複合フォーマットで取り込むこともできます。
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
x
と y
には取り込む矩形領域の始点(左下)座標を指定します。width
と height
には矩形領域の幅と高さを指定します。これらの値に負値を指定すると GL_INVALID_VALUE
エラーが生成されます。(x
+ width
) がレンダーバッファの幅を超える、または (y
+ height
) がレンダーバッファの高さを超えるような矩形領域を指定した場合は GL_INVALID_OPERATION
エラーが生成されます。
format
と type
の組み合わせで、取り込むイメージのフォーマットを指定することができます。
format |
type |
フォーマット |
ビット数 |
---|---|---|---|
|
|
RGBA8 |
32 |
|
RGBA4 |
16 |
|
|
RGBA5551 |
16 |
|
|
|
RGB8 |
24 |
|
RGB565 |
16 |
|
|
|
BGRA8 |
32 |
|
BGRA4 |
16 |
|
|
BGRA5551 |
16 |
|
|
|
LA8 |
16 |
|
|
L8 |
8 |
|
|
A8 |
8 |
|
|
Depth |
32 |
|
Depth |
24 |
|
|
Depth |
16 |
|
|
Depth |
8 |
|
|
|
Stencil |
8 |
|
|
Depth + Stencil |
32 |
上表で示したもの以外の組み合わせを指定した場合は GL_INVALID_ENUM
エラーが生成されます。
pixels
には取り込んだイメージが指定されたフォーマットで格納されます。
カラーバッファから取り込んだイメージはリニアフォーマットで格納され、ピクセルデータのバイトオーダーは OpenGL 準拠となっています。
デプスバッファから取り込んだイメージもリニアフォーマットで格納されますが、ピクセルデータは下位ビットから順に並びます。例えば、24 ビットのフォーマットで取り込んだ場合は、下位 8 ビット、中位 8 ビット、上位 8 ビットの順にメモリに格納されます。
ステンシルバッファから取り込んだイメージはリニアフォーマットで格納され、1 バイトが 1 ピクセルに対応しています。
デプスバッファとステンシルバッファから複合フォーマットで取り込んだイメージもリニアフォーマットで格納されますが、ピクセルデータは下位ビットから順に並び、デプス値の下位 8 ビット、中位 8 ビット、上位 8 ビット、ステンシル値の 8 ビットの順にメモリに格納されます。
フレームバッファにカラーバッファが関連付けられていないなど、フレームバッファに関連するエラーが発生した場合は GL_INVALID_FRAMEBUFFER_OPERATION
エラーが生成されます。ライブラリ内で一時メモリの確保に失敗した場合は GL_OUT_OF_MEMORY
エラーが生成されます。
14.2. コピーピクセル
glCopyPixels()
による、ほかのフレームバッファへのコピーには対応していません。
glCopyTexImage2D()
や glCopyTexSubImage2D()
を呼び出すことでカラーバッファの内容をテクスチャにコピーすることができます。詳しくは「7.5.1. カラーバッファからのコピー」を参照してください。
14.3. テクスチャレンダリング
テクスチャをレンダーバッファとしてフレームバッファに関連付けることができます。詳しくは「7.6. レンダーターゲットへのテクスチャの指定」を参照してください。
14.4. フレームバッファのクリア
OpenGL では glClear()
によるフレームバッファ(関連付けられている各種バッファ)のクリアにシザーテストやマスキング処理が影響しますが、3DS ではグラフィックス処理のパイプラインに含まれていないために影響を受けません。
フレームバッファに関連付けることのできるレンダーバッファは、「3.3.1. レンダーバッファの確保」にもあるように、カラーバッファ(ガスレンダリング用のバッファやテクスチャを含む)とデプスバッファ、ステンシルバッファの 3 つです。インデックスカラーには対応していません。
バッファのクリアは、glClear()
の引数にクリアするバッファに対応するビットを指定して呼び出すことで行われます。
void glClear(GLbitfield mask);
mask
に指定するビットフィールドには、以下のものから選択します。複数のバッファを同時にクリアする場合は、ビットフィールドの論理和を指定してください。
mask |
クリアされるバッファ |
---|---|
|
カラーバッファ |
|
デプスバッファ |
|
ステンシルバッファ。 |
3DS のステンシルバッファはデプスバッファと複合したバッファ(GL_DEPTH24_STENCIL8_EXT
)のため、ステンシルバッファのみをクリアすることはできません。
14.4.1. クリアカラー
カラーバッファをクリアする際に使用されるカラーを glClearColor()
で指定することができます。
void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
指定されたカラーの各成分は 0.0 ~ 1.0 の範囲にクランプされます。デフォルトでは、各成分とも 0.0 が設定されています。
14.4.2. クリアデプス
デプスバッファをクリアする際に使用されるデプス値を glClearDepthf()
で指定することができます。
void glClearDepthf(GLclampf depth);
指定された値は 0.0 ~ 1.0 の範囲にクランプされます。デフォルトでは 1.0 が設定されています。