OpenGL中NPOT纹理的现状

5

我目前正在编写一个使用2D OpenGL输出和sdl的游戏,并尝试使用SDL_ttf加载文本。然而,由于普通的OpenGL不支持非2次幂纹理,我必须用空白像素填充文本。我听说有一个名为GL_ARB_texture_non_power_of_two的OpenGL扩展可以启用非2次幂纹理。截至今天,有多少张卡片与此扩展不兼容,我该如何加载它?


2
我建议坚持使用POT纹理并进行填充。我相信有人会提供许多好的理由来支持这样做。 - Matt Razza
1
答案是支持非常好,除非你使用的是ATI显卡。 - Mikola
2个回答

10

任何OpenGL 2.0或更高版本都支持非幂次方纹理,这意味着几乎2005年之后制造的所有显卡都支持。这包括GeForce FX和6xxx及以上系列。还包括Radeon 9500及以上系列(尽管在Radeon HD系列之前,Radeons不允许NPOTs拥有mipmaps)。

顺便说一句,我希望你不要试图将每个字符放入单独的纹理中,因为从性能角度来看那样做非常糟糕。将所需使用的所有字符放在一个纹理中,并挑选出需要的字符即可。甚至不需要使用NPOT。

至于mrazza关于仅使用POTs的评论,对于NPOT纹理,我们没有必要害怕(只要硬件支持)。虽然在性能上可能会有轻微的惩罚,但对于明显情况下无法进行填充或缩放的情况(渲染目标等),使用它们是毫无问题的,不应该视为首选。


它们可能会有轻微的性能损失:您的意思是即使在不进行填充时复制的像素较少,也会有性能损失吗? - Sudarshan S
但请记住,ATI驱动程序似乎总是有问题(尽管我不知道当前状态),就像许多其他事情一样。我记得它们在我曾经拥有的X1650上工作过(使用2.0/2.1驱动程序),但在GLSL中没有工作。 - Christian Rau
@Sudarshan S:我强调“minor”这个词是有原因的。一般情况下你不需要担心它,但为了充分披露,从NPOT纹理访问可能比从POT纹理访问慢。再次强调,这只是一个小问题 - Nicol Bolas
旧的 ATI 驱动程序版本(特别是那些针对不再更新的旧硬件,如 X1600 的版本)在 NPOT 实现方面存在缺陷,因此即使它们声称支持,通常也无法正常工作,并会产生乱码纹理。 - Igor Levicki
在实践中,驱动程序可能对某些OpenGL功能支持不佳/存在错误,因此您可能需要采用黑名单来限制某些卡/驱动程序/操作系统的组合,例如:https://developer.blender.org/rB9d3a17922cad62f1f73ba60eef669a091a2b8687 - ideasman42

2
通常,这些问题的答案可以在OpenGL规范中找到。
然而,非2次幂纹理早在很久以前就被集成到OpenGL中了,你需要查看旧版本才能找到对此的参考。例如,在3.0规范中,你会看到在附录L.3中,NPOT扩展已经被集成到GL核心中,从GL 2.0开始支持该特性。因此,任何支持GL 2.0的实现(这几乎是自2004年末以来所有PC GPU)都支持该功能。
至于如何“加载”它:不需要做任何事情,只需将非2次幂大小传递给glTexImage即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接