0

我目前正在与一个软件一起工作,该软件通过拍摄几张图像然后将它们平铺成游戏地图来生成游戏地图。现在我正在使用 OpenGL 来绘制这些地图。如您所知,在 OpenGL 中切换状态并进行多次绘制调用的成本很高。我决定实现一个纹理图集系统,这将允许我在一次绘制调用中绘制整个地图,而无需状态切换。但是,我在实现纹理图集时遇到了问题。首先,将每个 TILE 存储在纹理图集中还是图像本身更好?其次,并非所有图像都保证是正方形的,甚至是 2 的幂。我是否将它们填充到最接近的 2 次方、平方或两者?我担心的另一件事是图像会变得非常大,而且我

到目前为止,从概念上讲,这是我所拥有的:

- 生成纹理

-绑定纹理

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

- 对纹理进行排序?

- 将子纹理上传到空白纹理,存储偏移量

- 解绑纹理

4

1 回答 1

7

这不是一个直接的答案,但我不能直接回答,因为你一次问了很多问题。我将尽力为您提供有关相关主题的尽可能多的信息。

以下是您的注意事项列表,可让您重新思考您的优先事项是什么以及您希望如何执行它们。

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

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

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

最后你可能想看看“纹理飞溅”,这是一种在不增加数据的情况下增加细节的方法。我不知道你在做什么,所以我不知道你是否可以使用它,但它很简单,并且在游戏行业中被大量使用。您可以创建一组随处使用的纹理(岩石、沙子、草等),并创建一个大纹理来跟踪哪个较小的纹理应用在何处。

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

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

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

于 2013-05-13T10:11:26.977 回答