小编San*_*mar的帖子

OpenGL中的NPOT支持R8G8B8纹理

我使用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.

c++ opengl

1
推荐指数
1
解决办法
342
查看次数

标签 统计

c++ ×1

opengl ×1