首先,您不应该真正使用 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 是pixels 中数据的格式,与glDrawPixels 中的同名参数的含义完全相同。本质上,format 告诉 OpenGL 在pixels 中的数据像素中有多少元素
type 告诉 OpenGL 包含单个像素的类型。现在这很有趣,因为它不平凡。
让我们看看一些组合:
格式 = GL_BGRA,类型 = GL_UNSIGNED_INT_8_8_8_8
这告诉 OpenGL 一个像素由 4 个元素组成,依次是蓝色、绿色、红色和 alpha,并且所有四个元素都包含在一个 32 位的无符号整数中,分为 4 组,每组 8 位。您可能知道 HTML 的颜色表示法,例如#ffffffff 写信。嗯,这本质上是一个 32 位 unsigned int 十六进制表示法。
你可以有一个 32 位无符号整数数组
uint32_t pixels[] = {
0xffffffff, 0x0000ffff, 0xffffffff,
0x0000ffff, 0xffffffff, 0x0000ffff,
0xffffffff, 0x0000ffff, 0xffffffff,
};
这将是一个 3×3 大小的白色地面上的红色钻石图像。
格式 = GL_RGB,类型 = GL_UNSIGNED_BYTE
在这种情况下,我们告诉 OpenGL 一个像素有 3 个元素,红色、绿色和蓝色,并且由于该类型没有明确指示子大小,因此这种类型的每个元素都包含该像素的一个颜色元素
我们的红色钻石会是这个样子
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
};
格式 = GL_RGBA,类型 = GL_FLOAT(或 GL_DOUBLE)
在这种情况下,像素的每个元素都是一个单独的浮点数,范围为 [0; 1]。然后钻石看起来像
float pixels[] = {
0., 1., 0.,
1., 0., 1.,
0., 1., 0.
};
对于 GL_DOUBLE,它看起来完全相同,但使用 double 而不是 float。
希望你现在掌握基本要点