首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JOGL语言中glDrawPixels()的数据格式

JOGL语言中glDrawPixels()的数据格式
EN

Stack Overflow用户
提问于 2013-02-13 07:41:43
回答 1查看 694关注 0票数 1

我现在对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语言中包装和格式化数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-13 08:07:58

首先,您不应该真正使用glDrawPixels。这是一个非常慢的函数,而且在大多数OpenGL实现中都没有得到很好的优化。您应该使用带纹理的四边形。但您的问题也适用于glTexImage2D的参数。

那么这些参数意味着什么呢。让我们来看看glTexImage2D的签名

代码语言:javascript
复制
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中同名的参数具有完全相同的含义。本质上,在pixels
  • type中,format告诉OpenGL每个像素数据有多少个元素,告诉OpenGL包含单个像素的类型。这很有趣,因为它不是微不足道的。

让我们来看一些组合:

格式= GL_BGRA,类型= GL_UNSIGNED_INT_8_8_8_8

这告诉OpenGL一个像素由蓝色、绿色、红色和阿尔法顺序的4个元素组成,并且所有4个元素都包含在一个32位的无符号整数中,分为4组,每组8位。你可能知道超文本标记语言的颜色表示法,例如#ffffffff表示书写。实际上,这是一个32位的无符号整数,采用十六进制表示法。

您可以有一个32位无符号整数数组

代码语言:javascript
复制
uint32_t pixels[] = {
 0xffffffff, 0x0000ffff, 0xffffffff,
 0x0000ffff, 0xffffffff, 0x0000ffff,
 0xffffffff, 0x0000ffff, 0xffffffff,
};

那将是一个3x3大小的白色地面上的红钻石图像。

格式= GL_RGB,类型= GL_UNSIGNED_BYTE

在这种情况下,我们告诉OpenGL一个像素有3个元素,红、绿和蓝,并且因为该类型没有显式指示消退,所以这种类型的每个元素都包含该像素的一个颜色元素

我们的红钻石应该是这样的

代码语言:javascript
复制
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。

代码语言:javascript
复制
float pixels[] = {
    0., 1., 0.,
    1., 0., 1.,
    0., 1., 0.
};

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

我希望你现在已经掌握了基本的要点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14843955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档