在OpenGL中使用四边形制作地形的最佳方法是什么?我想为我的地形提供大约30种不同的纹理(每种地形类型有1种纹理,因此有30种地形类型),并且希望在任意两种地形之间有平滑的过渡。
我一直在网上做一些浏览,发现有很多不同的方法,包括3D纹理,Alpha通道,混合和使用着色器。但是,哪些是最有效的,可以处理我想要使用的纹理量?例如:This popular answer描述了如何使用某些技术,但由于mixmap只有4个属性(RGBA),因此只能支持4个纹理。
我还应该注意,我对着色器一无所知,因此非着色器需要的技术会更好。
答案 0 :(得分:3)
由于您链接到描述texture splatting的答案,并且其问题提到了游戏Oblivion,我可以提供一些额外的见解。
使用RGBA混合贴图的基本纹理喷涂仅支持每个地形四个纹理四个,但您可以为不同的四边形使用不同的纹理集。 Oblivion将其地形划分为每边32个网格点(192英尺)的正方形(称为“单元格”),每个单元格定义自己的四个地形纹理集。因此,您不能在一个小区域内拥有大量纹理多样性,但您可以轻松地在较大区域上改变纹理。如果您愿意,可以为较小的区域定义纹理集,甚至是单个四边形,但代价是使用更多内存。
如果四元组中确实需要四个以上的纹理,则可以使用多个混合地图。对于每个额外的一个,您只需执行另一个纹理查找以获得另外四个混合因子,并在前一个mixmap的结果之上混合另外四个纹理。您可以根据需要扩展到任意数量的纹理,再次以牺牲内存为代价。
纹理拼接在高度贴图上与LOD技术相结合可能很棘手,因为当单个低细节地形四边形表示一组高细节四边形时,您必须为不同的混合贴图采样几个大四边形的区域。 Oblivion通过仅对全细节地形使用纹理喷溅来回避这个问题;以较低分辨率渲染的远程单元格使用编辑器生成的预先计算的纹理,它可以提前进行喷溅和缩小。
答案 1 :(得分:3)
纹理喷溅的一种替代方法是使用clipmap渲染“megatexture”。使用这种方法,您可以使用单个大型纹理来表示整个地形,并且可以通过加载RAM的不同部分来填充RAM,其中只需要根据查看器的当前位置实际渲染它所需的细节。 (在完整细节处无法看到地形的远处部分,因此无需在完整细节处加载它们。)
这种方法的优点是它的艺术自由:您可以在纹理中的任何位置放置精细的细节,而不考虑顶点网格。缺点是它实现起来相当复杂,并且整个剪贴图必须存储在某处,可能存储在磁盘上的大文件中,以便您可以根据需要将其中的部分内容加载到RAM中。 p>