Java JOGL中glDrawPixels()的数据格式

Java JOGL中glDrawPixels()的数据格式,java,opengl,glut,jogl,Java,Opengl,Glut,Jogl,我现在对glDrawPixels()函数感到困惑。 我知道函数签名是这样的: glDrawPixels(整数宽度、整数高度、格式、类型、数据) 我不知道如何使格式类型数据保持一致。 例如,我必须使用GL2.GL_RGB格式 对于type=GL2.GL\u DOUBLE,GL2.GL\u FLOAT,GL2.GL\u BYTE,分别, 数据是什么样子的?在调用glDrawPixels()函数之前,我应该如何用Java包装和格式化数据 首先,你不应该真正使用gldraw像素。这是一个非常慢的函数,并

我现在对glDrawPixels()函数感到困惑。 我知道函数签名是这样的: glDrawPixels(整数宽度、整数高度、格式、类型、数据)

我不知道如何使格式类型数据保持一致。 例如,我必须使用GL2.GL_RGB格式 对于type=GL2.GL\u DOUBLE,GL2.GL\u FLOAT,GL2.GL\u BYTE,分别,
数据是什么样子的?在调用glDrawPixels()函数之前,我应该如何用Java包装和格式化数据

首先,你不应该真正使用gldraw像素。这是一个非常慢的函数,并且在大多数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中的内部格式

  • 格式
    像素中的数据的格式
    与glDrawPixels中相同名称的参数具有完全相同的含义。本质上,
    格式
    告诉OpenGL在
    像素

  • type
    告诉OpenGL包含单个像素的类型。现在这很有趣,因为它不平凡

让我们看看一些组合:

格式=GL_BGRA,类型=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大小的白底红钻石图像

格式=GL\U RGB,类型=GL\U无符号\U字节 在本例中,我们告诉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\U RGBA,类型=GL\U浮点(或GL\U双精度) 在这种情况下,像素的每个元素都是一个单独的浮点,范围为[0;1]。钻石看起来就像

float pixels[] = {
    0., 1., 0.,
    1., 0., 1.,
    0., 1., 0.
};
对于GL_DOUBLE,它看起来完全相同,但是使用了
DOUBLE
而不是
float



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

首先,您不应该真正使用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中的内部格式

  • 格式
    像素中的数据的格式
    与glDrawPixels中相同名称的参数具有完全相同的含义。本质上,
    格式
    告诉OpenGL在
    像素

  • type
    告诉OpenGL包含单个像素的类型。现在这很有趣,因为它不平凡

让我们看看一些组合:

格式=GL_BGRA,类型=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大小的白底红钻石图像

格式=GL\U RGB,类型=GL\U无符号\U字节 在本例中,我们告诉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\U RGBA,类型=GL\U浮点(或GL\U双精度) 在这种情况下,像素的每个元素都是一个单独的浮点,范围为[0;1]。钻石看起来就像

float pixels[] = {
    0., 1., 0.,
    1., 0., 1.,
    0., 1., 0.
};
对于GL_DOUBLE,它看起来完全相同,但是使用了
DOUBLE
而不是
float



我希望您现在了解了uint32和uint 8示例的基本要点。浮点数,比如GL_FLOAT和GL_DOUBLE,是否有合适的数组/容器来保存像素数据?我理解您关于uint32_t和uint_8示例的示例。浮点数,比如GL_FLOAT和GL_DOUBLE,有没有合适的数组/容器来保存像素数据?