gpt4 book ai didi

c++ - OpenGL 中对 R8G8B8 纹理的 NPOT 支持

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:11 41 4
gpt4 key购买 nike

我使用 glew 和 glut 创建了一个示例应用程序,它读取一个 dds 文件并显示它。我手动读取 dds 文件(R8G8B8 中的 NPOT(886 x 317) 文件)并创建数据指针(unsigned char*)。

然后我用

准备了纹理
void prepareTexture(int w, int h, unsigned char* data) {

/* Create and load texture to OpenGL */
glGenTextures(1, &textureID); /* Texture name generation */
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
w, h,
0, GL_RGB, GL_UNSIGNED_BYTE,
data);
glGenerateMipmap(GL_TEXTURE_2D);
}

enter image description here

在上图中,第一个显示的是原始dds文件,第二个是我的应用程序的渲染结果,这显然是错误的。如果我将图片的大小调整为 1024 x 512,两张图片看起来会一样。

来自OpenGL Specification

I.3 Non-Power-Of-Two Textures

The restriction of textures to power-of-two dimensions has been relaxed for all texture targets, so that non-power-of-two textures may be specified without generating errors. Non-power-of-two textures was promoted from the ARB texture non power of two extension.

据我所知,从 OpenGl 2.0 开始我们可以使用 NPOT 纹理,而 OpenGL 会处理这个问题。

我尝试使用 DevIL 图像库加载 dds 文件,但结果相同。如果我将图像转换为 RGBA 并将 glTexImage2D 的内部格式和格式更改为 GL_RGBA,即使 dds 文件是 NPOT,我也会得到正确的结果。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
w, h,
0, GL_RGBA, GL_UNSIGNED_BYTE,
data);

我在带有 NVIDA 卡和 Radeon 卡的 PC 上尝试了应用程序,它们都给出了相同的结果。

我的示例源代码可以从link 下载。

有人能告诉我我的申请有什么问题吗?或者如果图像在 R8G8B8 中,OpenGL 不允许 NPOT。

最佳答案

这看起来像是对齐问题。在 glTexImage2D() 调用之前添加:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

此值以字节为单位指定数据的行对齐方式。默认值为 4。

GL_RGB 的纹理宽度为 886,每像素 3 字节,每行为 886 * 3 = 2658 字节,不是 4 的倍数。

使用默认的 UNPACK_ALIGNMENT 值,大小将四舍五入到下一个 4 的倍数,即 2660。因此每行将读取 2660 字节,这解释了增加的移位对于每一行。第一行是正确的,第二行是 2 个字节,第二行是 4 个字节,第三行是 6 个字节,等等。

关于c++ - OpenGL 中对 R8G8B8 纹理的 NPOT 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30995650/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com