2012-07-30 147 views
3

在OpenGL中纹理地形的最佳方式是什么?我对地形有大约30种不同的纹理(每种地形1种纹理,30种地形类型),并希望在任何两种地形之间有平滑的过渡。纹理Opengl地形?

我一直在网上做一些浏览,发现有很多不同的方法,包括3D纹理,Alpha通道,混合和使用着色器。但是,哪些是最有效的,并且可以处理我期望使用的纹理数量?例如:This popular answer描述了如何使用一些技术,但由于mixmap只有4个属性(RGBA),所以只能支持4个纹理。

我还应该指出,我对着色器一无所知,所以非着色器所需的技术将是可取的。

+0

您是否使用任何LOD技术,例如[ROAM](http://www.cognigraph.com/ROAM_homepage/)或[几何剪辑映射](https://research.microsoft.com/en-us/um /人/霍普/凸出/ geomclipmap /)?这可能会影响你的纹理选项。 – Wyzard 2012-07-31 00:18:10

+0

我目前没有做任何LOD技术,但我会研究这些技术。 – LucasS 2012-07-31 01:18:07

+0

FWIW,[几何剪贴图更适合现代GPU](https://research.microsoft.com/en-us/um/people/hoppe/proj/gpugcm/)。 – Wyzard 2012-07-31 01:40:33

回答

3

既然你链接到了描述texture splatting的答案,而且它的问题提到了游戏遗忘,我可以提供一些额外的洞察。

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

如果您确实需要四个以上的四个纹理,则可以使用多个混合贴图。对于每个额外的纹理查找,您只需进行另一次纹理查找即可获得四个混合因子,并在前一个混合贴图的结果顶部再混合四个纹理。您可以根据需要放大任意数量的纹理,同样以牺牲内存为代价。

由于当单个低细节地形四边形代表一组高细节四边形时,您必须针对不同区域的样本使用几个不同的混合地图进行采样,因此在高度图上使用LOD技术可能会很棘手,大四方。遗忘仅通过对全细节地形使用纹理溅射来回避该问题;以较低分辨率渲染的遥远单元使用由编辑器生成的预先计算的纹理,其预先进行了喷溅和缩小。

+0

感谢您的解释:) – LucasS 2012-08-04 04:51:05

3

纹理泼溅的一种替代方法是使用clipmap来呈现“megatexture”。通过这种方法,您可以获得一张表示整个地形的大型纹理,并且可以避免通过加载其中的不同部分来填充内存,只需根据实际需要根据观察者的当前位置渲染它即可。 (地形的遥远部分不能全部看到,因此不需要全部加载)

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