C++ OpenGL立方体贴图Perlin噪声到球体的转换

4
我目前正在制作一些行星生成的项目,主要是为了好玩并且希望最终能够拥有一些非常棒的行星。我使用的是一个立方体,通过规格化被映射成了一个球体。 planet terrain and sky 在这张图片中,地形还没有正确贴图。这只是高度图的渲染。然而这不是我的问题所在。当从一个立方体创建一个球体时,你会发现6个面都弯曲成了球体的形状。因此,我没有经纬度可以用于将球形高度图包裹到地形上。目前我正在使用立方体贴图。然而,这引起了一些问题,如下图所示: cube-to-sphere mapping problems 这就是我的问题所在。问题是由于球体仍具有立方体的拓扑结构所致。我必须为每个面生成一个高度图。我目前使用Libnoise来处理高度图,这也是大问题的开始。我可以将其导出为球形高度图,但如果我只有一个立方体,那就没有用了;或者我可以使用平面高度图,但必须将其映射到所有6个面上。然而,由于映射的工作原理,我可以让3个面沿中间对接无缝拼接,但最后一个高度图与第一个高度图不匹配,因为Libnoise使用边界并创建坐标网格。
球体的创建方法如下—
for(int i = 0; i < vertices.size(); i++)
{

    glm::vec3 oldVec = vertices[i];
    glm::vec3 newVec = glm::normalize(oldVec);
    vertices[i] = newVec * glm::vec3(500, 500, 500);
}

这样做的原因可以在这里看到:这里
然而,球体的结构将使得后期以Quad-Tree形式实现LOD更容易。我是否可以使用LibNoise生成立方体贴图高度图?或者我是否可以做些什么来使球体能够使用球形高度图?
我找到了如何使用Sphere Maps进行渲染,但是当我使用Quad Tree时这种方法行不通。但是,它产生了一些不错的结果,比如: enter image description here 所以,我需要知道如何将噪声平铺到立方体贴图中。可以使用Libnoise或在顶点着色器中实现。
1个回答

1

我终于按照我的意愿使它工作了。为了做到这一点,我通常会在没有立方体贴图或球形贴图的情况下展开立方体。我使用3D Perlin噪声以立方体贴图的形式应用高度,但我没有使用UV坐标,因此我没有将其展开为立方体贴图也无所谓。然后,根据顶点的高度应用纹理,似乎产生了很好的效果。也许以后会遇到问题,谁知道呢。这是我现在得到的图片:

enter image description here

提示:那不是月亮,而是太阳。为了测试目的,它更接近,并且我目前没有太阳纹理,所以我只是使用了一张旧的灰度高程图纹理,以便我能更好地看到它。行星现在开始看起来很棒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接