在opengl中显示任意大小的2d图像

时间:2008-11-25 17:23:53

标签: opengl image textures

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

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

EDIT2 - 即使你没有arb纹理大小,然后使你的图像更小并重新调整到窗口大小,即使在低端硬件上它也非常快

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果我可以为将来遇到这个问题的人添加 - 你在网上找到的关于OpenGL的大部分文档和教程/示例都已经过时了很多年,包括nehe.gamedev的内容,并会引导你认为像非二次纹理大小这样的东西在它们实际上不是一个问题时,或鼓励你使用长期以来不赞成使用的opengl函数,或者十年来没有更新过的库。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果要使用2个纹理的强度,请创建可以占据图像的最小纹理,并计算适当的纹理坐标,以仅显示包含图像的纹理部分。例如。如果您的图像是400x300,则使用512x512纹理,逐行复制图像,右侧纹理坐标为400.0 / 512.0,下部为300.0 / 512.0。这看起来比软件缩放更好。

答案 5 :(得分:0)

我完全按照你的描述做,复制成2次幂纹理并相应地调整我的紫外线。扩展程序会很好,但不能保证它们在任意计算机上都受支持。