【问题标题】:OpenGL texture format for bitwise RGB array用于按位 RGB 数组的 OpenGL 纹理格式
【发布时间】:2018-07-29 06:00:12
【问题描述】:

我正在做一个小型宠物项目,我有一个使用这种方法打包的 RGB 颜色的一维数组:

int rgb = (((unsigned int)r) << 16) | (((unsigned int)g) << 8) | b

并且图像数据是这样存储在数组中的

int x, y;
for (x = 0; x < img->w; ++x) {
    for (y = 0; y < img->h; ++y) {
        img->buf[(y) * img->w + (x)] = color;
    }
}

我对 OpenGL 的了解不够深入,无法理解如何将数据放入纹理缓冲区。这是我用来上传数据的方法,但显然这只会导致看起来很奇怪的黑白混乱。

GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, test->w, test->h, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)test->buf);

我尝试弄乱glPixelStorei(GL_UNPACK_ALIGNMENT, 1)glTexImage2D 的不同纹理格式选项,但似乎没有任何效果。我看过这个帖子:Colour bit-wise shift in OpenGL shader GLSL 这似乎是相似的,我只是不明白如何达到这一点。

谁能帮忙?

【问题讨论】:

    标签: c opengl bit-manipulation textures texture2d


    【解决方案1】:

    您没有显示 img->buf 的类型,但您似乎正在存储 32 位整数。这意味着每个像素有 8 个额外(未使用)位,这需要成为格式的一部分。最简单的方法是告诉 OpenGL 它是 alpha。 (对于 GL_RGB 的内部格式,任何 alpha 输入都将被忽略。)低位为蓝色,高位为 alpha,这表明您必须使用格式 GL_BGRA。

    如果您使用 GL_UNSIGNED_BYTE 作为类型,那么这些整数的字节顺序也很重要。我猜你正在使用小端平台(x86),在这种情况下 GL_UNSIGNED_BYTE 可以工作,但如果你使用 GL_UNSIGNED_INT_8_8_8_8_REV,它会变得更便携。因此,我猜你想要

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, test->w, test->h, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, (GLvoid*)test->buf);
    

    (更新为建议 GL_UNSIGNED_INT_8_8_8_8_REV)

    【讨论】:

    • 谢谢,是的,很抱歉我没有显示 img->buf 的类型和我的平台,但是你猜对了,这很好用,非常感谢!跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多