【问题标题】:How to write a heatmap shader that supports 1 milion data points in Unity3D如何在 Unity3D 中编写支持 100 万个数据点的热图着色器
【发布时间】:2019-10-31 16:14:08
【问题描述】:

我有一个新要求,即为我当前的项目集成一个热图,该热图将支持多达 100 万个数据点并将其投影到我的地形网格上。

我读过这篇文章:https://www.alanzucconi.com/2016/01/27/arrays-shaders-heatmaps-in-unity3d/ 并尝试实现它,经过一番修改后取得了成功。修补部分正在改变:

uniform float3 _Points [100]; // The positions (x,y,z)
uniform float2 _Properties [100] // The properties (x = radius, y = intensity)

uniform float4 _Points [100]; // The positions (x,y,z)
uniform float4 _Properties [100] // The properties (x = radius, y = intensity)

以及对脚本的一些调整。我已经设法向上投影到 100 个随机点,并且热图被正确渲染。在我提高数字后,我的 FPS 开始急剧下降,最后我遇到了一个问题,即我的着色器崩溃后不允许拥有超过 1023 个数据点。请注意,虽然我将热图投影到 3D 网格上,但我只使用两个数据点 (X,Z),因为最终结果应该是 2D 热图。

我该如何解决这个(对我来说)任务的怪物,因为 1023 分似乎离 100 万太远了,所以我认为我做的效率很低。

另外,这个项目需要在 Windows、Mac 和 Linux 上跨平台运行,所以我更喜欢 OpenGL 作为渲染器。

【问题讨论】:

  • 这取决于你使用的图形我猜例如对于OpenGL
  • 我忘了说这是一个跨平台项目,所以它必须在 Linux、Mac 和 Windows 上运行,所以最好是 OpenGL
  • 听起来你已经设计了这个,所以你需要在每一帧上迭代一百万个项目......我会先看看你是否可以每帧迭代更少的东西。也许如果您可以在第一帧上迭代数百万个事物以创建 texture2D 映射(可能使用计算着色器?)然后缓存在 c# 中,然后在接下来的每个帧上,您只需遍历已更改的几个点,更改texture2D 相应地,然后将更新后的 texture2D 发送到渲染着色器。
  • @Ilhan 你真的看过我发布的链接吗?那里说,在 OpenGL 中,总共允许的着色器组件有一定的限制.. 它非常小,所以你应该尝试找到另一种方法.. 不使用数组
  • 您确实无法将所有东西都塞进制服中,并希望每个片段可以迭代超过一百万个项目。如果我正确理解您的问题,我的方法是首先将点渲染为 3D 纹理,然后在渲染最终的 2D 热图时使用它。

标签: c# unity3d shader


【解决方案1】:

您可以将要渲染的网格划分为多个网格,并将应保留在地图该部分中的点传递给每个网格。通过这种方式,您可以解决使用单个网格的制服的限制。 我使用的着色器与您使用的基本相同,实际上我想使用计算机着色器来传递更多数据,但我不是这方面的专家,现在我必须采用我的解决方案。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多