c++ - 纹理 Opengl 地形?

标签 c++ opengl textures terrain

在 OpenGL 中用四边形制作地形纹理的最佳方法是什么?我有大约 30 种不同的纹理我想为我的地形(每种地形类型 1 个纹理,所以 30 种地形类型)并且希望在任何两个地形之间平滑过渡。

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

我还应该指出,我对着色器一无所知,因此非着色器所需的技术会更可取。

最佳答案

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

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

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

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

关于c++ - 纹理 Opengl 地形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11730759/

相关文章:

c++ - rapidjson:如何将 Document 对象拆分为较小的 Document 对象?

python - 如果不是每次都重新编译,numpy ctypes "dynamic module does not define init function"错误

c++ - OpenGL 立方体贴图 : Writing to mipmap

python - GTK 窗口捕获 : VPython (OpenGL) application

c++ - 通过 texture2D 函数使用自动比较从阴影贴图纹理中采样数据

c++ - 带有 SOIL 的 OpenGL 纹理

c# - 在 Unity 中仅将纹理应用于立方体的某些面

c++ - 如何确定缓存的阻塞因子

c# - 如何在.net框架上使用vst sdk

android - LibGDX 保存纹理以避免上下文丢失