gpt4 book ai didi

java - JOGL 中 glDrawPixels() 的数据格式

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:51 26 4
gpt4 key购买 nike

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

我不知道如何使格式类型数据保持一致。例如,我必须使用 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 内部的格式。

  • formatpixels 中数据的格式,并且与 glDrawPixels 中的同名参数具有完全相同的含义。本质上,format 告诉 OpenGL 一个数据像素有多少个元素,以像素为单位

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

让我们看看一些组合:

格式 = GL_BGRA,类型 = GL_UNSIGNED_INT_8_8_8_8

这告诉 OpenGL,一个像素由 4 个元素组成,顺序为蓝色、绿色、红色和 alpha,并且所有四个元素都包含在一个 32 位无符号整数中,分为 4 组,每组 8 位。您可能知道 HTML 的颜色表示法,例如#ffffffff 用于写入。嗯,这本质上是一个十六进制表示的 32 位无符号 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)

在这种情况下,像素的每个元素都是一个单独的 float ,范围为 [0; 1]。钻石看起来像

float pixels[] = {
0., 1., 0.,
1., 0., 1.,
0., 1., 0.
};

对于 GL_DOUBLE,它看起来完全相同,但使用 double 而不是 float

<小时/>

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

关于java - JOGL 中 glDrawPixels() 的数据格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14843955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com