我使用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,则两个图像看起来都相同。
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);
我使用NVIDA卡和Radeon卡在PC上试用了这个应用程序,它们都给出了相同的结果。
我的示例源代码可以从link
下载有人可以告诉我我的申请有什么问题吗?或者,如果图像在R8G8B8中,OpenGL不允许NPOT。
答案 0 :(得分:8)
这看起来像对齐问题。在glTexImage2D()
来电之前添加此内容:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
此值指定数据的行对齐方式(以字节为单位)。默认值为4.
GL_RGB
的纹理宽度为886,每像素为3个字节,每行为886 * 3 = 2658个字节,不是4的倍数。
默认情况下UNPACK_ALIGNMENT
值,大小将四舍五入到4的下一个倍数,即2660.因此每行将读取2660个字节,这解释了每行的增加的移位。第一行是正确的,第二行是2字节关闭,第二行是4字节关闭,第三行是6字节关闭等等。