我现在对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包装和格式化我的数据。
答案 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中内部的格式。
format
是pixels
中数据的格式,与完全的含义与glDrawPixels中同名参数的含义相同。基本上format
告诉OpenGL pixels
type
告诉OpenGL包含单个像素的类型。现在这很有意思,因为它非常重要。
让我们看看一些组合:
这告诉OpenGL一个像素由蓝色,绿色,红色和alpha的4个元素组成,并且所有四个元素都包含在32位的单个无符号整数中,分为4组,每组8位。您可能知道HTML的颜色表示法,例如写#ffffffff
。好吧,这实际上是十六进制表示法中的32位无符号整数。
你可以有一个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
。
我希望你现在得到基本的要点