程序行星,高度图和纹理


19

我目前正在开发OpenGL程序行星生成器。我希望将其用于太空RPG,它将不允许玩家进入行星表面,因此我忽略了与ROAM相关的任何内容。目前,我正在绘制带有VBO的立方体并将其映射到球体上。

我熟悉大多数分形高度图生成技术,并且已经实现了我自己的中点位移版本(在我所知道的情况下没有那么有用)。

我的问题是,程序上生成高度图的最佳方法是什么。我看过libnoise,它使我可以创建可调整的高度图/纹理,但据我所知,我需要生成一个像这样的网。

使平铺变得明显。

有人可以建议我采取最佳路线吗?

任何输入将不胜感激。

Answers:


18

首先,我不确定如果人们无法着陆,为什么要实现高度图(即几何位移),所以法线贴图似乎更有效。

如此说来,您想要的是将任意坐标转换为琐碎(x, y, z)(u, v)坐标。无需立方体贴图。

替代文字

替代文字

  1. 每个(u, v)纹理像素都有一个高度(heightmap RGB = height)和一个位置(x, y, z) = pos
  2. 找到位置并对其进行规范化NORMAL(x, y, z) = N
  3. 新顶点= pos+N*height

更高的镶嵌效果会更好。还要libnoise对高度图使用正确的球面贴图,看起来像这样(但黑白):

替代文字



1

中点位移高度映射是一个不错的起点。OP,您为什么认为不是?

OP可以很好地将行星表面建模为立方体贴图,因为任何平面贴图(例如墨卡托投影)在数学上都会具有丑陋且复杂的变形。

如果我是OP,我首先会忘记大型行星的几何形状。我将创建一个立方体贴图,其中每个面为2 ** N + 1像素(2、3、5、9、17、33 ...),每个纹理像素编码的高度为[0..N],其中0为海拔预期的最低海沟,N是地球上预期的最高山的海拔。

然后,我将计算立方体的八个顶点的随机高度,并将其传播到立方体贴图的六个正方形中,以便每个顶点显示三遍。

当我递归生成边缘中点的分形高度时,我将确保将面边缘顶点传播到共享它们的另一面。

完成后,我将得到一个立方体贴图,其中所有边缘纹理都加倍,所有拐角纹理都加倍。无需将其转换为法线贴图-我将使用Morten Mikkelsen论文中的算法在运行时直接从高度图渲染法线。

在运行时,我可能会绘制一个覆盖行星投影到屏幕的四边形,并在像素着色器中进行一次射线-球面相交测试,以发现我是否撞上了行星以及在何处。Sure击败了对高度细分的球体模型进行栅格化的方法,并获得了不错的平滑边缘。


1

中点位移噪声(最大位移由像素的绝对经度缩放)可以快速生成球形噪声图。可以将以海拔高度,坡度,日照或经度为参数的色表用于自动为行星着色。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.