まず第一に、実際にはglDrawPixelsを使用するべきではありません。これは非常に遅い関数であり、ほとんどのOpenGL実装ではあまり最適化されていません。代わりに、テクスチャードクワッドを使用する必要があります。しかし、あなたの質問はglTexImage2Dのパラメータにも当てはまります。
では、これらのパラメーターはどういう意味ですか。glTexImage2Dの署名を見てみましょう
C SPECIFICATION
void glTexImage2D( GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels )
internalformat
データがOpenGLの内部で持つ形式を指定します。
format
はデータの形式であり、glDrawPixelsの同じ名前のパラメータとまったくpixels
同じ意味を持ちます。基本的に、OpenGLにデータのピクセルにいくつの要素があるかを伝えますformat
pixels
type
OpenGLに単一のピクセルを含むタイプを通知します。さて、これは重要です。
いくつかの組み合わせを見てみましょう:
フォーマット=GL_BGRA、タイプ= GL_UNSIGNED_INT_8_8_8_8
これにより、OpenGLは、ピクセルが青、緑、赤、アルファの順序で4つの要素で構成され、4つの要素すべてが32ビットの単一の符号なし整数に含まれ、それぞれ8ビットの4つのグループに分割されることを通知します。#ffffffff
HTMLの色表記(たとえば書き込み用)をご存知かもしれません。これは基本的に、16進表記の32ビットunsignedintです。
32ビットの符号なし整数の配列を持つことができます
uint32_t pixels[] = {
0xffffffff, 0x0000ffff, 0xffffffff,
0x0000ffff, 0xffffffff, 0x0000ffff,
0xffffffff, 0x0000ffff, 0xffffffff,
};
これは、白地に赤いダイヤモンドの3×3サイズの画像になります。
フォーマット=GL_RGB、タイプ= GL_UNSIGNED_BYTE
この場合、ピクセルには赤、緑、青の3つの要素があり、タイプには明示的なサブサイズが示されていないため、このようなタイプの各要素にはピクセルの1つのカラー要素が含まれていることをOpenGLに通知します。
私たちの赤いダイヤモンドはこのようになります
uint8_t pixels[] = {
0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff,
0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00,
0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff
};
format = GL_RGBA、type = GL_FLOAT(またはGL_DOUBLE)
この場合、ピクセルの各要素は、範囲[0; 1]。ダイヤモンドは次のようになります
float pixels[] = {
0., 1., 0.,
1., 0., 1.,
0., 1., 0.
};
GL_DOUBLEの場合、まったく同じように見えますが、double
代わりに。が付いていfloat
ます。
基本的な要点を理解していただければ幸いです