OpenGL中的NPOT支持R8G8B8纹理

San*_*mar 1 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);
}
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.

Ret*_*adi 8

这看起来像对齐问题.在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字节关闭等.