我已经成为很多问题的人,并且你们给出了所有的答案,接下来是几个教程,因为我谷歌搜索中的所有链接都被标记为“已经访问过”我决定把我的骄傲放在一边为你发一个问题。
这是我的第一篇帖子,所以我不知道我是否正确的对不起,如果没有,无论如何问题是这样的:
我在团结5的C#行星探索游戏中工作,我已经根据这里提到的一些教程用八角形构建了一个球体,并且还可以用它们构建perlin纹理和高度图,问题将它们应用到球体并在网格上产生地形,我知道我必须映射球体的顶点和UV来做到这一点,但问题是我真的很厌倦数学的东西,我找不到任何一步一步跟进,我听说过Tessellation着色器,LOD,voronoi噪音,perlin噪音,并且在这个过程中迷失了。简化:
我有什么:
我有球形网
我有高度图
我已将它们与适当的法线贴图一起分配给一个材料
基于高度图
如何使用这些基于Tessellation LOD的着色器等制作真正大小的程序行星
非常感谢你的注意,对不起,如果我很粗鲁或被要求太多,但你能提供的任何帮助对我都有很大的帮助。
答案 0 :(得分:1)
我真的不认为我有能力为您提供代码特定信息,但以下是您的核对清单的一些补充/建议。
如果你想设置一个LOD网格物体和纹理系统,我知道怎么做的唯一方法就是你在物理上创建网格和纹理的低多边形版本的准系统方法,然后在Unity中写一个脚本,你有一个距离数组,一旦玩家到达一定距离或朝向对象,切换到网格和适合该距离的纹理。我认为你可以通过编写一个可以做同样事情的着色器来做同样的事情,但基本思想保持不变。这里有一些伪代码作为示例(我不太了解Unity库):
int distances[] = {10,100,1000}
Mesh mesh[] = {hi_res_mesh, mid_res_mesh, low_res_mesh}
Texture texture[] = {hi_res_texture, mid_res_texture, low_res_texture}
void Update()
{
if(player.distance < distances[0])
{
gameobject.Mesh = mesh[0]
gameobject.Texture = texture[0]
else
{
for(int i = 1; i < distances.length(); i++)
{
if (player.distance <= distances[i] && player.distance >= distances[i-1]):
{
gameobject.Texture = texture[i]
gameobject.Mesh = mesh[i]
}
}
}
}
如果你想要真正的基于Tesselation的LOD,那么代码就更难了:这里有一些链接:
https://developer.nvidia.com/content/opengl-sdk-simple-tessellation-shader
http://docs.unity3d.com/Manual/SL-SurfaceShaderTessellation.html
基本上相同的概念适用。但是,不是物理地改变您正在使用的网格和纹理,而是使用相同的设置距离更改网格和纹理,您可以在其中更改着色器代码中网格和纹理的分辨率。
http://answers.unity3d.com/questions/274269/mesh-deformation.html
http://blog.almostlogical.com/2010/06/10/real-time-terrain-deformation-in-unity3d/
无论如何,祝你好运,如果我不清楚某些事情或需要更多解释,请告诉我。