【问题标题】:Data Format for glDrawPixels() in JOGLJOGL 中 glDrawPixels() 的数据格式
【发布时间】:2013-02-12 23:41:42
【问题描述】:

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

【问题讨论】:

    标签: java opengl glut jogl


    【解决方案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 内部的格式。

    • formatpixels 中数据的格式,与glDrawPixels 中的同名参数的含义完全相同。本质上,format 告诉 OpenGL 在pixels 中的数据像素中有多少元素

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

    让我们看看一些组合:

    格式 = GL_BGRA,类型 = GL_UNSIGNED_INT_8_8_8_8

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

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

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

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


    希望你现在掌握基本要点

    【讨论】:

    • 我理解你关于 uint32_t 和 uint_8 例子的例子。像 GL_FLOAT 和 GL_DOUBLE 这样的浮点数怎么样,有没有合适的数组/容器来保存像素的数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多