14. フレームバッファオペレーション

フレームバッファオペレーションでは、フレームバッファに対する読み込み、コピーなどの処理が行われます。

3DS では、対応している機能が以下のように制限されています。

  • glDrawBuffer() は実装されていません。
  • glReadBuffer() は実装されていません。
  • glDrawPixels() は実装されていません。
  • glReadPixels() はカラーバッファ、デプスバッファ、ステンシルバッファの内容を取得することができます。
  • glCopyPixels() は実装されていません。
  • glPixelStore*() は実装されていません。

 

14.1. リードピクセル

フレームバッファに関連付けられているレンダーバッファ(カラーバッファ、デプスバッファ、ステンシルバッファ)の内容を、glReadPixels() でメモリに取り込むことができます。デプスバッファとステンシルバッファの内容を複合フォーマットで取り込むこともできます。

コード 14-1. glReadPixels() の定義
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, 
                  GLenum format, GLenum type, void* pixels);

x y には取り込む矩形領域の始点(左下)座標を指定します。widthheight には矩形領域の幅と高さを指定します。これらの値に負値を指定すると GL_INVALID_VALUE エラーが生成されます。(x + width) がレンダーバッファの幅を超える、または (y + height) がレンダーバッファの高さを超えるような矩形領域を指定した場合は GL_INVALID_OPERATION エラーが生成されます。

format type の組み合わせで、取り込むイメージのフォーマットを指定することができます。

表 14-1. 取り込み時に指定することのできるフォーマット

format

type

フォーマット

ビット数

GL_RGBA

GL_UNSIGNED_BYTE

RGBA8

32

GL_UNSIGNED_SHORT_4_4_4_4

RGBA4

16

GL_UNSIGNED_SHORT_5_5_5_1

RGBA5551

16

GL_RGB

GL_UNSIGNED_BYTE

RGB8

24

GL_UNSIGNED_SHORT_5_6_5

RGB565

16

GL_BGRA

GL_UNSIGNED_BYTE

BGRA8

32

GL_UNSIGNED_SHORT_4_4_4_4

BGRA4

16

GL_UNSIGNED_SHORT_5_5_5_1

BGRA5551

16

GL_LUMINANCE_ALPHA

GL_UNSIGNED_BYTE

LA8

16

GL_LUMINANCE

GL_UNSIGNED_BYTE

L8

8

GL_ALPHA

GL_UNSIGNED_BYTE

A8

8

GL_DEPTH_COMPONENT

GL_UNSIGNED_INT

Depth

32

GL_UNSIGNED_INT24_DMP

Depth

24

GL_UNSIGNED_SHORT

Depth

16

GL_UNSIGNED_BYTE

Depth

8

GL_STENCIL_INDEX

GL_UNSIGNED_BYTE

Stencil

8

GL_DEPTH24_STENCIL8_EXT

GL_UNSIGNED_INT

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() の引数にクリアするバッファに対応するビットを指定して呼び出すことで行われます。

コード 14-2. glClear() の定義
void glClear(GLbitfield mask);

mask に指定するビットフィールドには、以下のものから選択します。複数のバッファを同時にクリアする場合は、ビットフィールドの論理和を指定してください。

表 14-2. クリアするバッファの指定

mask

クリアされるバッファ

GL_COLOR_BUFFER_BIT

カラーバッファ

GL_DEPTH_BUFFER_BIT

デプスバッファ

GL_STENCIL_BUFFER_BIT

ステンシルバッファ。GL_DEPTH_BUFFER_BIT と同時に指定しなければなりません。

3DS のステンシルバッファはデプスバッファと複合したバッファ(GL_DEPTH24_STENCIL8_EXT)のため、ステンシルバッファのみをクリアすることはできません。

14.4.1. クリアカラー

カラーバッファをクリアする際に使用されるカラーを glClearColor() で指定することができます。

コード 14-3. クリアカラーの指定
void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);

指定されたカラーの各成分は 0.0 ~ 1.0 の範囲にクランプされます。デフォルトでは、各成分とも 0.0 が設定されています。

14.4.2. クリアデプス

デプスバッファをクリアする際に使用されるデプス値を glClearDepthf() で指定することができます。

コード 14-4. クリアデプスの指定
void glClearDepthf(GLclampf depth);

指定された値は 0.0 ~ 1.0 の範囲にクランプされます。デフォルトでは 1.0 が設定されています。

14.4.3. クリアステンシル

ステンシルバッファをクリアする際に使用される値を glClearStencil() で指定することができます。

コード 14-5. クリアステンシルの指定
void glClearStencil(GLint s);

クリアに使用する値を 0 ~ 255 の範囲で指定します。デフォルトでは 0 が設定されています。