Java JOGL中glDrawPixels()的数据格式
我现在对glDrawPixels()函数感到困惑。 我知道函数签名是这样的: glDrawPixels(整数宽度、整数高度、格式、类型、数据) 我不知道如何使格式类型数据保持一致。 例如,我必须使用GL2.GL_RGB格式 对于type=GL2.GL\u DOUBLE,GL2.GL\u FLOAT,GL2.GL\u BYTE,分别,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()函数之前,我应该如何用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 )
指定数据在OpenGL中的内部格式internalformat
是格式
与glDrawPixels中相同名称的参数具有完全相同的含义。本质上,像素中的数据的格式
告诉OpenGL在格式
像素
告诉OpenGL包含单个像素的类型。现在这很有趣,因为它不平凡type
#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 )
指定数据在OpenGL中的内部格式internalformat
是格式
与glDrawPixels中相同名称的参数具有完全相同的含义。本质上,像素中的数据的格式
告诉OpenGL在格式
像素
告诉OpenGL包含单个像素的类型。现在这很有趣,因为它不平凡type
#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,有没有合适的数组/容器来保存像素数据?