OpenGL中的NPOT支持R8G8B8纹理

时间:2014-10-30 07:55:26

标签: c++ opengl

我使用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非二次力量纹理

  对于所有纹理目标,纹理对二维幂的限制已经放宽,因此   可以在不生成的情况下指定非幂二纹理   错误。从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。

1 个答案:

答案 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字节关闭等等。