我只是在学习如何在 OpenGL 中进行纹理处理,并且对我得到的一些结果感到有些困惑。
我正在使用 stb_image 加载以下棋盘格 png 图像:
当我保存 png 图像时,我明确选择将其保存为 32 位。这会让我相信每个组件 (RGBA) 将存储为 8 位,总共 32 位 - 无符号整数的大小。但是,使用以下代码:
unsigned char * texture_data =
stbi_load("resources/graphics-scene/tut/textures/checker.png", &w, &h, nullptr, 4);
// ...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0,
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, texture_data);
产量:
如果我改为使用 GL_UNSIGNED_BYTE 作为类型参数,我会得到正确的结果。
另外,为了有帮助,我还尝试了以下图片:
产生
GL_UNSIGNED_BYTE 在这种情况下也给出了正确的结果。
我不确定这是否是我误解 glTexImage2D 或 stb_image 的情况(它是否将加载的数据转换为 8 位?这对我来说似乎不太可能)。
编辑:我终于找到了一个相关的帖子(已经搜索了一些但没有运气)。但是答案(https://stackoverflow.com/a/4191875/2507444)让我感到困惑。如果是这种情况 - 类型参数指定每个组件有多少字节- 那么 GL_UNSIGNED_BYTE_3_3_2 和 GL_UNSIGNED_INT_8_8_8_8 到底是什么意思?