1

我现在对 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 中包装和格式化我的数据。

4

1 回答 1

1

首先,您不应该真正使用 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.


我希望你现在了解基本要点

于 2013-02-13T00:07:58.240 回答