纹理图集的正确实现

时间:2013-05-12 19:49:38

标签: c++ opengl texture2d

我目前正在与一块软件一起工作,该软件通过拍摄几张图片然后将它们拼接成游戏地图来生成游戏地图。现在我正在使用OpenGL来绘制这些地图。如您所知,在OpenGL中切换状态并进行多次绘制调用的成本很高。我决定实现一个纹理图集系统,它允许我在没有状态切换的单个绘图调用中绘制整个地图。但是,我在实现纹理图集方面遇到了问题。首先,将每个TILE存储在纹理图集或图像本身中会更好吗?其次,并非所有图像都保证是方形的,甚至是2的幂。我是否将它们填充到最接近的2,正方形或两者的功率?我担心的另一件事是图像可能变得非常大,我担心超出纹理的OpenGL大小限制,这会迫使我拆分地图,破坏整个概念。

到目前为止,这是我的概念:

- 生成纹理

- 绑定纹理

- 生成大到足以容纳纹理的图像(考虑填充?)

- 排序纹理?

- 将子纹理添加到空白纹理,存储偏移

-Unbind texture

1 个答案:

答案 0 :(得分:7)

这不是一个直接的答案,但我不能直接回答,因为你一次提出很多问题。我会尽量在相关主题上给你尽可能多的信息。

以下是您的注意事项列表,允许您重新考虑您的优先级以及您希望如何执行它们。

首先,根据我的经验(!!),使用纹理数组比使用纹理图集容易得多,性能大致相同。纹理数组完全按照您的想法执行,您可以基于变量名称和索引在着色器中对其进行采样,而不仅仅是名称(即:mytexarray [0])。其中一个重大缺点包括为阵列中的所有纹理提供相同的纹理大小,优点是:在一次绘制调用中轻松索引子纹理和绑定。

其次,总是使用2的幂。我不知道最近的一些系统是否允许完全没有问题的2个纹理的非幂,但是(再次根据我的经验)最好使用2的幂。在绘制纹理四边形时,我在500 * 500纹理中遇到的问题之一是黑色线条,这些黑色线条恰好是填充到最接近的2的幂(x和y上为12个像素)所需的大小。因此,即使在最近的硬件上,OpenGL也会为您创建此问题。

关于规模,第三个(这是英语吗?)你所有的问题似乎都处理图像,纹理。您可能希望查看纹理缓冲区,它们允许将大量数据流式传输到GC并且比纹理更容易更新(这允许LOD地图系统)。如果您使用纹理但仅需要以颜色表示的数据,而不是直接使用颜色,这种情况非常好。

最后,您可能希望查看“纹理喷溅”,这是一种在不增加数据的情况下增加细节的方法。我不知道你到底在做什么,所以我不知道你是否可以使用它,但它很容易,并且它在游戏行业中得到了很多应用。你创建了一组你到处使用的纹理(岩石,沙子,草等),以及一个大纹理,可以跟踪哪些较小的纹理应用于哪里。

我希望我在这里写的至少一件事可以帮助你, 祝你好运!

PS:openGL纹理大小限制取决于用户的显卡,因此请注意大小超过2048 * 2048,即使您的计算机运行正常,其他人也可能会遇到严重问题。安全值高达1024 * 1024。

PSS:请原谅任何语法错误,如有需要请求澄清。此外,这是我的第一个回答,原谅我缺乏协议。