如何在OpenGL中处理NPOT纹理贴图生成,保持扫描线对齐



我有以下情况:

  • 非2次幂(NPOT)纹理,RGB格式。
  • 我在纹理的右侧添加了一些填充,以确保纹理扫描线是4字节的倍数。
  • 我需要生成mipmap
  • glGenerateMipmaps()不可靠(我相信它实际上是在苹果的英特尔HD Graphics 3000驱动程序上被打破的,因为它给出了错误的结果,但在Linux上正确的结果,相同的设备)和缓慢(再次在我的芯片的苹果驱动程序上,在Linux上快速)。

为了解决最后一个问题,我决定使用带有渲染到纹理方法的framebuffers"手动"生成mipmap。

然而,我被困在我应该如何处理填充,使扫描线的四个字节的倍数,而在着色器中有一致的mipmap采样。在没有mipmaps的情况下,我使用uniform vec2来乘以uv,以补偿纹理右侧的几列填充。现在的问题是,在mipmap的每一层,我必须做填充,使扫描线4字节对齐;但是这个填充在每个级别上都是不同的,这需要我为每个级别使用不同的uv倍增器,这是我不能在着色器中做的事情,因为我想在采样时使用自动LOD(细节级别)选择。

我猜这个问题相当于:"在我的场景中,一个成功的glGenerateMipmaps算法能做什么?"关于这个函数的文档非常短。实际上,我很惊讶Linux驱动程序在我的复杂场景中能正确地完成工作。

在我的场景中不可接受的简单解决方案(因为内存使用增加):

  • 使用RGBA格式,这样扫描线总是4字节对齐。
  • 使用POT纹理,这样扫描线总是4字节对齐。

我在纹理的右侧添加了一些填充,以确保纹理扫描线是4字节的倍数。

好吧,别那样做了。你链接到的文章并没有说"总是让你的纹理对齐到4字节"。它说要确保你上传的纹理数据中的字节对齐与你给OpenGL的像素包字节对齐相匹配。

只要让你的纹理大小是你需要的,然后上传数据与适当的对齐。纹理宽度不需要是4的倍数

相关内容

  • 没有找到相关文章

最新更新