我现在对 glDrawPixels() 函数感到困惑。我知道函数签名是这样的: gl.glDrawPixels(int width, int height, format, type, data);
我不确定如何使格式类型数据保持一致。例如,我必须使用格式为 GL2.GL_RGB,我分别要求 type=GL2.GL_DOUBLE、GL2.GL_FLOAT、GL2.GL_BYTE,数据是什么样的?在调用 glDrawPixels() 函数之前,我应该如何在 Java 中包装和格式化我的数据。
首先,您不应该真正使用 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 包含单个像素的类型。现在这很有趣,因为它不平凡。
让我们看一些组合:
这告诉 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 大小的白色地面上的红色钻石图像。
在这种情况下,我们告诉 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
};
在这种情况下,像素的每个元素都是一个单独的浮点数,范围为 [0; 1]。钻石看起来像
float pixels[] = {
0., 1., 0.,
1., 0., 1.,
0., 1., 0.
};
对于 GL_DOUBLE 它看起来完全一样,但用double
而不是float
.
我希望你现在了解基本要点