我使用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.
这看起来像对齐问题.在glTexImage2D()
通话前添加:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
Run Code Online (Sandbox Code Playgroud)
此值指定数据的行对齐(以字节为单位).默认值为4.
纹理宽度为886,每个像素为3个字节GL_RGB
,每行为886*3 = 2658个字节,不是4的倍数.
使用UNPACK_ALIGNMENT
默认值时,大小将向上舍入为4的下一个倍数,即2660.因此,每行将读取2660个字节,这解释了每行的移位增加.第一行是正确的,第二行是2字节关闭,第二行是4字节关闭,第三行是6字节关闭等.