如何在Unity3D中编写支持100万数据点的热力图着色器

3
我有一个新的需求,需要为我的项目集成一个热力图,支持高达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)

to

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

通过对脚本进行一些调整,我已经成功将随机点投影到了100个点,并且热力图被正确渲染了。当我增加了数据量后,我的FPS开始急剧下降,最终遇到了一个问题:在1023个数据点之后,我的着色器崩溃了。请注意,尽管我将热力图投影到了三维网格上,但最终结果只使用两个数据点(X、Z),因为结果应该是一个二维热力图。

如何解决这个(对我来说)庞大的任务?1023个数据点似乎远离100万,所以我认为我做得非常低效。

此外,这个项目必须在Windows、Mac和Linux平台上运行,因此我更喜欢使用OpenGL作为渲染器。


我想这取决于你使用什么图形库,例如OpenGL - derHugo
1
听起来你的工程需要在每一帧迭代一百万个项目...我建议你先尝试减少每一帧的迭代数量。也许你可以在第一帧迭代这一百万个项目,创建一个texture2D地图(也许使用计算着色器?),然后在C#中缓存它,在每个随后的帧中只需迭代一些已更改的点,相应地更改texture2D,然后将更新后的texture2D发送到渲染着色器。 - Ruzihm
@Ilhan你真的看了我发布的链接吗?上面说OpenGL中总共允许一定数量的着色器组件..这个数量非常小,所以你应该尝试找到另外一种方式..不使用数组。 - derHugo
@Ruzihm,我认为你的建议会起作用,我只需要测试一下。是的,我按照你说的方式进行了设计,因为这是我在这个领域的经验所能想到的唯一方法。 - Ilhan
1
你确实无法将所有内容都塞进uniform中,并希望能够在每个片段上迭代一百万个项目。如果我正确理解了你的问题,我的方法是先将点渲染到3D纹理中,然后在渲染最终的2D热图时使用它。 - Daniel Hesslow
显示剩余3条评论
1个回答

2
您可以将渲染的网格分成多个部分,并将应留在该部分地图中的点传递给每个部分。这样,您可以通过单个网格来解决uniforms数量的限制。我曾经使用过与您相同的着色器,实际上我想使用计算机着色器来传递更多数据,但我不是那方面的专家,现在我只能使用我的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接