2

我正在模拟一个旧客户端,大多数纹理都是 128x128。我知道切换纹理和渲染调用很昂贵,我可以在运行时摆脱,创建一个包含所有微小纹理的非常大的纹理图集。

然后从那里,我可以绑定大纹理并通过着色器渲染图集中的纹理偏移吗?这会带来什么样的性能冲击?我的第二个问题涉及排序。关卡文件被分解成 BSP 树的小块。它们非常小,每个级别通常有数千个。当前的方式,肯定是较慢的是,我在每个 BSP 叶中渲染我的平截头体和 PVS(Quake 3 风格)中的每组纹理。解决这个问题的想法是什么?

我是否想遍历我可以看到的每个区域(从后到前),并按纹理对所有可见三角形进行分组,然后一次全部渲染。出于某种原因,我总觉得这可能会更慢。首先排序并一次渲染所有区域或跳过排序并一次渲染每个区域是否更有意义?

4

1 回答 1

1

是的,应该可以将纹理填充到纹理图集中。需要仔细考虑诸如纹理是否被平铺,以及您希望使用 mip-map 和过滤发生什么等问题。

我可能会建议在你整理好几何图形之前推迟这样做 - 将绘制调用的数量减少到一个合理的数字可能就是你需要做的所有事情。在现代硬件上,更改纹理的成本并不一定那么糟糕。

至于渲染关卡,在现代硬件上更常见的是从前到后渲染,而不是从后到前,以利用 z-buffer 和早期剔除(即,如果你在摄像机前面有一堵墙,并且您首先在启用 z 缓冲的情况下绘制它,硬件非常擅长拒绝您然后尝试在其后面绘制的东西)。

一种可能的方法是将 BSP 重新处理为更粗略的结构,例如简单的网格(或者可能是四叉树或八叉树)。你甚至不需要整齐地分割多边形,只需要一堆带有边界框的扇区,然后平截头体剔除然后松散地排序(从前到后)这些框。您也可以使用这种方法保留 PVS,但是当您的渲染块变得更大和更粗糙时,它的有用性可能会下降。

但是,在执行任何此操作之前,我绝对建议您设置一些基准测试并记录性能信息。除非您实际分析性能,否则您将无法确定自己是否在做正确的事情。如果你能准确地指出你正在做的最糟糕的事情是什么,你只需要修复它。

于 2012-12-06T07:23:59.110 回答