我使用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);
}
Run Code Online (Sandbox Code Playgroud)
在上图中,第一个显示原始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);
Run Code Online (Sandbox Code Playgroud)
我在PC上使用NVIDA卡和Radeon卡试用了这个应用程序,它们都给出了相同的结果.
我的示例源代码可以从链接下载
谁能告诉我我的申请有什么问题?或者,如果图像在R8G8B8中,则OpenGL不允许NPOT.