如何在OpenGL中处理NPOT纹理mipmap生成,记住扫描线对齐?

如何在OpenGL中处理NPOT纹理mipmap生成,记住扫描线对齐?,opengl,Opengl,我有以下情况: RGB格式的非二次幂(NPOT)纹理 我在纹理的右侧添加了一些填充物 我需要生成mipmap glGenerateMipmaps()是不可靠的(我相信它实际上在苹果的英特尔HD Graphics 3000驱动程序上被破坏了,因为它给出了错误的结果,但在Linux上是正确的结果,在同一设备上),而且速度很慢(同样在我芯片的苹果驱动程序上,在Linux上速度很快) 为了解决最后一个问题,我决定使用具有渲染到纹理方法的帧缓冲区“手动”生成mipmap 然而,在着色器中进行一致的mi

我有以下情况:

  • RGB格式的非二次幂(NPOT)纹理
  • 我在纹理的右侧添加了一些填充物
  • 我需要生成mipmap
  • glGenerateMipmaps()
    是不可靠的(我相信它实际上在苹果的英特尔HD Graphics 3000驱动程序上被破坏了,因为它给出了错误的结果,但在Linux上是正确的结果,在同一设备上),而且速度很慢(同样在我芯片的苹果驱动程序上,在Linux上速度很快)
为了解决最后一个问题,我决定使用具有渲染到纹理方法的帧缓冲区“手动”生成mipmap

然而,在着色器中进行一致的mipmap采样时,我一直在思考如何处理填充以使扫描线乘以四个字节。没有mipmaps,我使用的是
uniform vec2
,用于将
uv
相乘,以补偿纹理右侧的几列填充。现在的问题是,在mipmap的每个级别,我都必须进行填充,以使扫描线4字节对齐;但这种填充在每个级别上都可能不同,这需要我为每个级别使用不同的
uv
-乘数,这是我在着色器中无法做到的,因为我希望在采样时使用自动LOD(细节级别)选择

我猜这个问题相当于:“成功的
glGenerateMipmaps
算法在我的场景中做了什么?”关于这个函数的文档非常简短。事实上,我很惊讶Linux驱动程序在我复杂的场景中做得很好

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

  • 使用RGBA格式,使扫描线始终为4字节对齐
  • 使用POT纹理,使扫描线始终4字节对齐
我在纹理的右侧添加了一些填充,以确保纹理扫描线是4字节的倍数

好吧,别这样。你链接到的文章没有说“总是让你的纹理对齐到4字节”。它说要确保上传的纹理数据中的字节对齐方式与提供给OpenGL的像素包字节对齐方式匹配


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

Afaik,4字节对齐仅在GPU->CPU传输时需要(反之亦然),但决不会影响着色器中的纹理。除非通过填充来增加
glTexImage2D
的size参数,否则我不明白填充为什么会影响mipmap生成或自动mipmap查找。啊,太好了!非常感谢你澄清了这一点。(我希望你能回答这个问题:P)