3

在 OpenGL 中对由四边形制作的地形进行纹理处理的最佳方法是什么?我想要为我的地形拥有大约 30 种不同的纹理(每种地形类型 1 种纹理,因此有 30 种地形类型),并且希望在任意两个地形之间进行平滑过渡。

我在网上做了一些浏览,发现有很多不同的方法,包括 3d 纹理、Alpha 通道、混合和使用着色器。但是,其中哪一个是最有效的并且可以处理我想要使用的纹理数量?例如:这个流行的答案描述了如何使用一些技术,但由于混合图只有 4 个属性(RGBA),所以只能支持 4 个纹理。

我还应该注意,我对着色器一无所知,因此不需要着色器的技术会更好。

4

2 回答 2

3

由于您链接到描述纹理飞溅的答案,并且它的问题提到了游戏 Oblivion,因此我可以提供一些额外的见解。

使用 RGBA 混合贴图的基本纹理喷溅仅支持每个地形四边形四个纹理,但您可以为不同的四边形使用不同的纹理集。Oblivion 将其地形划分为每边 32 个网格点(192 英尺)的正方形(称为“单元”),每个单元定义自己的一组四个地形纹理。所以你不能在一个小区域内有很多纹理多样性,但你可以很容易地在更大的区域内改变你的纹理。如果您愿意,可以为较小的区域(甚至是单个四边形)定义纹理集,但会占用更多内存。

如果你真的需要一个四边形中超过四个纹理,你可以使用多个混合贴图。对于每增加一个,您只需进行另一次纹理查找以获得另外四个混合因子,并在前一个混合图的结果之上再混合四个纹理。您可以根据需要扩展到任意数量的纹理,但同样会以内存为代价。

纹理喷溅可能很难与高度图上的LOD技术结合使用,因为当单个低细节地形四边形代表一组高细节四边形时,您必须为大四边形的不同区域采样几个不同的混合贴图。Oblivion 通过仅对全细节地形使用纹理飞溅来回避该问题;以较低分辨率渲染的远距离单元使用编辑器生成的预先计算的纹理,它会提前进行喷溅和缩小。

于 2012-07-31T02:38:28.473 回答
3

纹理喷溅的一种替代方法是使用剪贴图来渲染“巨型纹理”。使用这种方法,您将拥有一个代表整个地形的大型纹理,并且您可以通过加载它的不同部分来避免填满 RAM,而只需根据查看者的当前位置渲染它实际需要的细节。(无法完整查看地形的远处部分,因此无需完整加载它们。)

这种方法的优点是它的艺术自由度:您可以在纹理中的任何位置放置精细的细节,而无需考虑顶点网格。缺点是实现起来相当复杂,整个clipmap必须存储在某个地方,可能是磁盘上的一个大文件,以便您可以根据需要将其中的一部分加载到RAM中。

于 2012-07-31T02:58:45.133 回答