Opengl地形纹理
Texturing Opengl Terrain?
在OpenGL中用四边形对地形进行纹理处理的最佳方法是什么?我想为我的地形提供大约30种不同的纹理(每个地形类型有1种纹理,所以有30种地形类型),并且希望在任意两种地形之间有平滑的过渡。
我一直在网上浏览,发现有很多不同的方法,包括三维纹理、Alpha通道、混合和使用着色器。然而,其中哪一个是最有效的,可以处理我想要使用的纹理数量?例如:这个流行的答案描述了如何使用一些技术,但由于混合贴图只有4个属性(RGBA),因此只能支持4个纹理。
我还应该注意,我对着色器一无所知,所以不需要着色器的技术会更好。
由于您链接到了一个描述纹理飞溅的答案,并且它的问题提到了游戏Oblivion,因此我可以对此提供一些额外的见解。
使用RGBA混合贴图的基本纹理飞溅每个地形四边形仅支持四个纹理,但可以为不同的四边形使用不同的纹理集。Oblivion将其地形划分为每侧32个网格点(192英尺)的正方形(称为"单元"),每个单元定义自己的一组四种地形纹理。因此,你不可能在一个小区域内有很多纹理多样性,但你可以很容易地在更大的区域内改变你的纹理。如果愿意,可以为较小的区域(甚至是单个四边形)定义纹理集,但代价是使用更多内存。
如果一个四边形中确实需要四个以上的纹理,可以使用多个混合贴图。对于每一个额外的纹理,只需执行另一个纹理查找即可获得另外四个混合因子,并在上一个混合贴图的结果之上再混合四个纹理。您可以根据需要放大到任意数量的纹理,这也是以牺牲内存为代价的。
纹理飞溅与高度贴图上的LOD技术相结合可能很棘手,因为当单个低细节地形四边形表示一组高细节四边形时,必须为大四边形的不同区域采样几个不同的混合贴图。Oblivion通过只对全细节地形使用纹理飞溅来回避这个问题;以较低分辨率渲染的远处单元使用编辑器生成的预先计算的纹理,编辑器会提前进行飞溅和缩小。
纹理飞溅的一种替代方法是使用剪切贴图来渲染"巨型纹理"。使用这种方法,您可以获得一个表示整个地形的大纹理,并且可以通过加载不同部分的细节来避免填充RAM,因为这些细节仅与根据查看器的当前位置渲染所需的细节一样多。(无法完全详细地看到远处的地形,因此无需完全详细地加载它们。)
这种方法的优点是其艺术自由:可以在纹理中任意位置放置精细的细节,而不考虑顶点网格。缺点是实现起来相当复杂,而且整个剪贴图必须存储在的某个地方,可能是在磁盘上的一个大文件中,这样您就可以根据需要将其部分加载到RAM中。
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- Qt OpenGL 渲染到纹理性能问题
- 使用 C++在 OpenGL 中对 3D 多边形进行纹理处理
- 无法获取要在 OpenGL ES2 中显示的 RGB 纹理
- 在 OpenGL 中加载纹理C++
- 添加新纹理OpenGL时,模型消失了
- 初始化多个纹理 OpenGL、SDL C++ 时出现问题
- 将多个纹理 OpenGL 绑定到不同的四边形
- 如何加载纹理Opengl
- 读写一个纹理(OpenGL)
- 渲染时加载纹理 (OpenGL)
- 如何绑定纹理openGL的一部分
- 将两个图像堆栈的非电源加载到 3D 纹理 OpenGL C++
- 我的精灵在纹理opengl之间切换
- 使用深度纹理OpenGL/GLSL的深度遮挡(3.3/330)
- 加载多纹理opengl 2.0
- 将位置写入纹理OpenGL/GLSL
- 为纹理OpenGL C++加载多个.bmp文件时出现问题