【问题标题】:How to render evolving heightmap in Unity5?如何在 Unity5 中渲染不断变化的高度图?
【发布时间】:2015-03-06 14:28:48
【问题描述】:

我在 Unity 中生成了一个灰度高度图,我想渲染它。类似于 Unity 中的地形,但不使用地形组件,并且能够经常更改而不会造成太多性能损失。

目前我生成一个网格(在 c# 中),然后在脚本中更改每一帧的顶点。然而,这很慢,并且限制了我的高度图的分辨率(Unity 只允许最多 65000 个顶点的网格)。

所以我想知道,有没有更好的方法来渲染这个高度图?

注意事项:

  • 几乎每一帧都会更改高度图。
  • 我使用纹理的一个通道(当前为红色通道)来存储高度。
  • 分辨率是主要问题,它应该允许 512、1024 及以上。
  • 我在 Mac 上使用 Unity5。

非常感谢!

【问题讨论】:

  • 我不是专家,但我很确定使用网格而不是高度图无论如何都会降低你的性能。
  • 是的。使用“作为网格”,我只是表示几何实际上是移动的。所以不像法线贴图,假装它。我删除了“作为网格”部分,因为它确实可能被误解。
  • 您是否需要生成的几何图形在场景中具有重要意义,或者如果它只是视觉效果,是否可以接受?如果是后者,顶点着色器可能能够在 GPU 上处理。
  • 目前仅可视化是可以的。然而,它后来成为游戏的一部分。我生成的高度图用于水和地面模拟,类似于 From Dusk。

标签: unity3d


【解决方案1】:

我不久前找到了如何执行此操作,但忘记发布我的解决方案。所以一年多之后,也许它会帮助其他人:

您可以简单地将顶点函数添加到任何着色器中:

首先添加类似:#pragma surface surf Standard fullforwardshadows vertex:vert(vertex:vert 部分很重要,类似的行可能已经在着色器中,所以只需将其添加到该行)。

然后用你的名字创建顶点函数(在我的例子中是“vert”):

void vert(inout appdata_full v) {
    float4 wsr = tex2Dlod(_MyTexture, v.texcoord);
    v.vertex.y = wsr.r + wsr.g + wsr.b;
}

你还需要一个采样器在某个地方(我只是把它放在 vert 函数上方)

sampler2D _MyTexture;

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2023-03-14
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多