我现在对glDrawPixels()函数感到困惑。我知道函数签名是这样的: gl.glDrawPixels(int width,int height,format,type,data);
我不确定如何使格式类型数据保持一致。例如,我必须使用format作为GL2.GL_RGB,我分别要求type=GL2.GL_DOUBLE,GL2.GL_FLOAT,GL2.GL_BYTE,数据是什么样子的?在调用glDrawPixels()函数之前,应该如何在Java语言中包装和格式化数据。
发布于 2013-02-13 08:07:58
首先,您不应该真正使用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中同名的参数具有完全相同的含义。本质上,在pixelstype中,format告诉OpenGL每个像素数据有多少个元素,告诉OpenGL包含单个像素的类型。这很有趣,因为它不是微不足道的。让我们来看一些组合:
格式= GL_BGRA,类型= GL_UNSIGNED_INT_8_8_8_8
这告诉OpenGL一个像素由蓝色、绿色、红色和阿尔法顺序的4个元素组成,并且所有4个元素都包含在一个32位的无符号整数中,分为4组,每组8位。你可能知道超文本标记语言的颜色表示法,例如#ffffffff表示书写。实际上,这是一个32位的无符号整数,采用十六进制表示法。
您可以有一个32位无符号整数数组
uint32_t pixels[] = {
0xffffffff, 0x0000ffff, 0xffffffff,
0x0000ffff, 0xffffffff, 0x0000ffff,
0xffffffff, 0x0000ffff, 0xffffffff,
};那将是一个3x3大小的白色地面上的红钻石图像。
格式= 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。
我希望你现在已经掌握了基本的要点。
https://stackoverflow.com/questions/14843955
复制相似问题