【发布时间】: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 热图时使用它。