我有以下情况:
- 非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的倍数