如何处理OpenGL中的NPOT纹理mipmap生成,保持扫描线对齐?

时间:2016-11-16 14:56:32

标签: opengl

我有以下情况:

  • RGB格式的非二次幂(NPOT)纹理。
  • 我在纹理的右侧添加了一些填充到make sure the texture scanlines are a multiple of 4 bytes
  • 我需要生成mipmap。
  • function init() { callFunction1(); callFunction2(); } 是不可靠的(我相信它实际上已经打破了Apple的Intel HD Graphics 3000驱动程序,因为它给出了错误的结果,但在Linux,同一设备上得到了正确的结果)并且速度很慢(再次在Apple驱动程序上)对于我的芯片,快速使用Linux)。

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

然而,我仍然坚持应该如何处理填充以使扫描线成为四个字节的倍数,同时在着色器中进行合适的mipmap采样。如果没有mipmap,我会使用glGenerateMipmaps()uniform vec2乘以uv,以便补偿纹理右侧的几列填充。现在,问题是在mipmap的每个级别,我都必须进行填充以使扫描线4字节对齐;但是这个填充在每个级别都可以不同,这需要我为每个级别使用不同的uv - 乘数,这是我在着色器中无法做到的事情,因为我想使用自动LOD(级别)细节)采样时的选择。

我想这个问题等同于:“在我的场景中,成功的glGenerateMipmaps算法做了什么?”关于这个功能的文件非常简短。实际上,我很惊讶Linux驱动程序在我的复杂场景中正确地完成了工作。

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

  • 使用RGBA格式,使扫描线始终为4字节对齐。
  • 使用POT纹理,使扫描线始终为4字节对齐。

1 个答案:

答案 0 :(得分:2)

  

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

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

只需将纹理大小设置为您需要的大小,然后使用正确的对齐方式上传数据。纹理宽度不需要是4的倍数。