C ++ OpenGL Cube Map Perlin Noise to Sphere

时间:2013-01-25 23:35:33

标签: opengl geometry mapping perlin-noise heightmap

我目前正在研究一些行星生成,主要是为了好玩,并希望最终得到一些踢屁股行星。我正在使用一个已通过规范化映射到球体的立方体。 planet terrain and sky

在此图片中,地形没有正确纹理。这只是Heightmap的渲染。但这不是我的问题。从立方体创建球体时,您将留下6个弯曲成球体形状的面。因此,我没有可用于在地形周围包裹球形高度图的纬度和经度。目前我正在使用Cube Mapping。但是,这会导致一些问题,您可以看到: cube-to-sphere mapping problems - 我的问题变得明显了。问题是由于球体仍然具有立方体的拓扑结构。我必须为每张脸生成一个高度图。我目前使用Libnoise作为高度图,这是大问题开始的地方。我可以将它导出为球形高度图 - 如果我有一个球体,这将是有用的 - 或者我可以使用必须映射到所有6个面的平面高度图。但是,由于映射的工作原理。我可以得到3个面在中间排列并且是无缝的,但最后的高度图不会连接到第一个,因为Lib噪声使用边界并创建坐标网格。

球体的创建方式如下 -

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);
}

可以看到here背后的原因。

然而,球体的结构将使以后以Quad-Ttee的形式更容易实现lod。无论如何我可以使用LibNoise生成立方体贴图高度图吗?或者我可以做些什么来使球体能够使用球形高度图?

我想出了如何使用Sphere Maps进行渲染,但是当我使用四叉树时这不会起作用。但是,它产生了一些不错的结果,如:

enter image description here

所以,我几乎需要知道如何将噪声平铺到立方体贴图中。使用Libnoise或顶点着色器。

1 个答案:

答案 0 :(得分:1)

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

enter image description here

PS:那不是月亮,而是太阳。为了测试目的它更接近,我现在没有太阳纹理,所以我只使用旧的灰度高度图纹理,所以我可以看到它更好。现在这个星球开始变得很棒了。