C++ OpenGL中对R8G8B8纹理的NPOT支持

C++ OpenGL中对R8G8B8纹理的NPOT支持,c++,opengl,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); /* Text

我使用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纹理提升 两个扩展的非幂

据我所知,从OpenGL2.0我们可以使用NPOT纹理,OpenGl将处理这个问题

我尝试使用DevIL image库加载dds文件,但最终得到了相同的结果。如果我将图像转换为RGBA,并将GLTEXAGE2D的内部格式和格式更改为GL_RGBA,即使dds文件为NPOT,我也会得到正确的结果

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
                w, h, 
                0, GL_RGBA, GL_UNSIGNED_BYTE,
                data);
我用NVIDA卡和Radeon卡在PC机上试用了这个应用程序,结果都是一样的

我的示例源代码可以从


谁能告诉我我的申请有什么问题吗?或者,如果图像在R8G8B8中,OpenGL不允许NPOT。

这看起来像是对齐问题。在调用
glTexImage2D()
之前添加以下内容:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
此值以字节为单位指定数据的行对齐方式。默认值为4

对于
GL_RGB
,纹理宽度为886,每像素3字节,每行为886*3=2658字节,不是4的倍数


默认值为
UNPACK_ALIGNMENT
时,大小将向上舍入到4的下一个倍数,即2660。因此,每行将读取2660个字节,这就解释了每行移位的增加。第一行将是正确的,第二行将关闭2个字节,第二行将关闭4个字节,第三行将关闭6个字节,等等。

这看起来像是对齐问题。在调用
glTexImage2D()
之前添加以下内容:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
此值以字节为单位指定数据的行对齐方式。默认值为4

对于
GL_RGB
,纹理宽度为886,每像素3字节,每行为886*3=2658字节,不是4的倍数


默认值为
UNPACK_ALIGNMENT
时,大小将向上舍入到4的下一个倍数,即2660。因此,每行将读取2660个字节,这就解释了每行移位的增加。第一行是正确的,第二行是2字节,第二行是4字节,第三行是6字节,等等。

这正是我的问题。这正是我的问题。