用于按位RGB数组的OpenGL纹理格式

时间:2018-02-19 02:18:51

标签: c opengl bit-manipulation textures texture2d

我正在开展一个小宠物项目,我有一个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似乎很相似,我只是不明白如何达到这一点。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

你没有显示img-&gt; 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)