JOGL中glDrawPixels()的数据格式

时间:2013-02-12 23:41:43

标签: java opengl glut jogl

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

1 个答案:

答案 0 :(得分: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中内部的格式。

  • formatpixels中数据的格式,完全的含义与glDrawPixels中同名参数的含义相同。基本上format告诉OpenGL pixels

  • 中的数据像素有多少元素
  • type告诉OpenGL包含单个像素的类型。现在这很有意思,因为它非常重要。

让我们看看一些组合:

format = GL_BGRA,type = GL_UNSIGNED_INT_8_8_8_8

这告诉OpenGL一个像素由蓝色,绿色,红色和alpha的4个元素组成,并且所有四个元素都包含在32位的单个无符号整数中,分为4组,每组8位。您可能知道HTML的颜色表示法,例如写#ffffffff。好吧,这实际上是十六进制表示法中的32位无符号整数。

你可以有一个32位无符号整数数组

uint32_t pixels[] = {
 0xffffffff, 0x0000ffff, 0xffffffff,
 0x0000ffff, 0xffffffff, 0x0000ffff,
 0xffffffff, 0x0000ffff, 0xffffffff,
};

这将是白色地面上的红色钻石的3×3大小的图像。

format = GL_RGB,type = 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
};

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


我希望你现在得到基本的要点