我使用 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);
}
上图中,第一个显示了原始的dds文件,第二个是我的应用程序的渲染结果,这显然是错误的。如果我将图像大小重新调整为 1024 x 512,则两个图像看起来将相同。
来自OpenGL规范
I.3 非二次方纹理
对于所有纹理目标,纹理对二维次方的限制已放宽,因此
可以指定非二次方纹理而不生成
错误。非二次幂纹理是从 ARB 纹理升级而来的
非二次幂的扩展。
据我所知,从 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);
我在带有 NVIDIA 卡和 Ration 卡的 PC 上尝试了该应用程序,它们都给出了相同的结果。
我的示例源代码可以从以下位置下载link
谁能告诉我我的申请有什么问题吗?或者如果图像是 R8G8B8,OpenGL 不允许 NPOT。