3

我需要使用纹理在 opengl 中显示 2d 图像。
图像尺寸不一定是 2 的幂。
我想创建一个更大的纹理并将显示限制在我正在使用的部分,但是图像数据将与 openCV 共享,所以我不想一次复制一个像素的数据变成更大的纹理。

编辑 - 事实证明,即使是 Windows 下最简单的英特尔板载显卡也支持非 2 次幂纹理。

EDIT2 - 即使您没有任意纹理大小,然后使您的图像更小并重新缩放到窗口大小,即使在低端硬件上也非常快

4

6 回答 6

2

我想到了几个 GL 扩展。看看GL_ARB_texture_rectangle(如果你不需要 mipmapping),或GL_ARB_texture_non_power_of_two(如果你这样做)。

于 2008-11-25T18:05:02.030 回答
1

要避免的一个陷阱是,出于某种原因,某些视频卡需要将 GL_UNPACK_ALIGNMENT 设置为 1 ( glPixelStorei(GL_UNPACK_ALIGNMENT, 1); ) 才能正确加载非二次幂纹理。

于 2009-01-05T16:22:34.153 回答
1

如果我可以为将来遇到此问题的任何人添加 - 您在网上找到的大多数关于 OpenGL 的文档和教程/示例都已经过时了很多年,包括 nehe.gamedev 的东西,并且会让您相信诸如非二次幂纹理大小之类的东西实际上不是问题,或者鼓励您使用早已弃用的 opengl 函数或十年未更新的库。

于 2010-04-02T06:41:23.263 回答
0

首先,大多数现代显卡实际上都支持非正方形和非二次方大小的纹理尺寸。但是为了获得最大的兼容性,可能建议只使用两种纹理的幂。

首先确定每个图像尺寸(宽度和高度)较大的最接近的 2 次幂,然后创建该尺寸的纹理。那么你有两个选择。第一个是对像素数据进行软件调整大小以适合图像,然后在需要显示时根据原始纵横比调整四边形的大小。或者,您可以只用图像数据填充纹理的一部分,然后在其余部分放置透明像素。

于 2008-11-25T18:03:05.500 回答
0

如果您想使用 2 次方纹理,请创建可以占用图像的最小纹理,并计算正确的纹理坐标以仅显示包含图像的纹理部分。例如,如果您的图像是 400x300,您将使用 512x512 纹理,将图像逐行复制到那里,您的正确纹理坐标将为 400.0/512.0,较低的一个 300.0/512.0。这看起来比软件缩放更好。

于 2008-12-29T16:51:17.013 回答
0

我完全按照您的描述进行操作,复制到 2 次幂纹理并相应地调整我的 uv。扩展会很好,但你不能保证它们在任意计算机上都受支持。

于 2008-12-29T16:58:39.807 回答