在OpenGL中显示任意大小的2D图像

3
我需要使用纹理在OpenGL中显示2D图像。
图像的尺寸不一定是2的幂次方。
我考虑创建一个更大的纹理,并限制显示到我正在使用的部分,但是图像数据将与openCV共享,因此我不想将数据逐个像素地复制到更大的纹理中。
编辑 - 结果发现即使是最简单的Windows下的Intel板载图形也支持非2的幂次方纹理。
编辑2 - 即使您没有arb纹理大小,那么将图像缩小并重新调整为窗口大小,在低端硬件上速度也非常快。
6个回答

2

谢谢。请注意检查是否可用:strstr((const char *)glGetString(GL_EXTENSIONS),”GL_ARB_texture_non_power_of_two”)。 - Martin Beckett

1
如果我可以为以后遇到此问题的任何人添加一点内容-大多数关于OpenGL的文档和教程/示例在网络上已经过时多年,包括nehe.gamedev的内容,并会让您相信非2的幂次方纹理尺寸是一个实际上并不成问题的问题,或者鼓励您使用早已被弃用的OpenGL函数,或者那些已经十年没有更新的库。

1
一个需要避免的陷阱是,由于某些原因,一些视频卡要求将GL_UNPACK_ALIGNMENT设置为1(glPixelStorei(GL_UNPACK_ALIGNMENT,1);),以便正确加载非2的幂纹理。

0

首先,大多数现代显卡实际上支持非正方形和非二的幂大小的纹理尺寸。但为了最大兼容性,建议仅使用二的幂大小的纹理。

首先确定每个图像维度(宽度和高度)中比其大的最接近二的幂大小,并创建该大小的纹理。 然后您有两个选项。第一个选项是对像素数据进行软件调整以适应图像大小,然后在需要显示时根据原始长宽比调整四边形的大小。或者,您可以只填充部分纹理与图像数据,并在其余部分放置透明像素。


这就是我之前做的,但它会破坏纹理数据和图像处理数据之间的数据排序,因此需要进行大量昂贵的复制。 - Martin Beckett

0

如果想使用2的次方数作为纹理,请创建最小的纹理来装载您的图像,并计算适当的纹理坐标以仅显示包含您的图像的部分纹理。例如,如果您的图像为400x300,则将使用512x512纹理,逐行将您的图像复制到那里,右侧纹理坐标将为400.0 / 512.0,下方将为300.0 / 512.0。这比软件缩放效果更好。


0

我完全按照你描述的做法,将其复制到2的幂纹理中,并相应地调整我的UV。扩展功能很好,但不能保证在任意计算机上都支持。


问题在于我希望数据能够与图像处理函数共享,而重新打包会很麻烦。 - Martin Beckett

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