1

我运行了一个(基本)体素引擎和一个看起来像这样(我假设基本上可以工作)的水系统:https ://www.youtube.com/watch?v=Q_TdeGIOOts (不是我的游戏)。
水值存储在一个 3d 浮点数组中,每 0.05 秒它通过检查下方和相邻的体素 (y-1, x-1, x+1, z-1, z+1) 来计算水流并添加价值。
该系统适用于少量水(70+ fps),但是当我开始计算 8+ 块的水时,它变得太多了。(我禁用了所有渲染或网格创建以检查这是否是瓶颈,它不是。它纯粹是流量计算)。
我不是一个很有经验的程序员,所以我不知道从哪里开始优化,除了像我已经做的那样在协程中进行计算。
在这篇文章中:https ://gamedev.stackexchange.com/questions/55414/how-to-define-areas-filled-with-water (靠近底部) Boreal 建议在计算着色器中运行它。这是我要走的路吗?我该怎么办?
任何帮助深表感谢。

4

1 回答 1

1

如果您真的在计算基于体素的模拟,那么随着尺寸的增加,您将几何地扩展计算数量,因此您将很快耗尽更大体积的处理能力。

计算着色器非常适合快速进行大规模并行计算,尽管它是一种非常不同的编程范式,需要一些时间来适应。计算着色器将查看缓冲区的内容(即,我们平民的“纹理”)并非常快速地对其进行处理 - 在您的情况下,缓冲区可能是一个缓冲区/纹理,其像素值代表水细胞。如果你想做一些非常简单的事情,比如向上或向下增加它们,计算着色器会使用 GPU 的并行处理能力来快速完成。

难点在于 GPU 已针对并行处理进行了优化。这意味着您不能编写像“texelA.value += texelB.value”这样的代码 - 如果您没有额外的工作,缓冲区的每个片段都会在对其他片段中发生的情况零了解的情况下进行处理。要引用其他纹理元素,您需要以某种方式再次读取纹理 - 一些技术使用偏移多次读取一个纹理(这个 GL 示例这样做是为了实现模糊,其他人通过重复处理纹理,将结果放入临时纹理然后重新处理。

在 10,000 英尺高度:是的,计算着色器是解决此类问题的好工具,因为它涉及大量自相似计算。但是,要做到这一点并不容易。如果您之前没有进行过常规着色器编程,您可能需要先了解一下以习惯 GPU 的工作方式。即使是非常基本的工具(if-then-else 或循环)在 GPU 编程中的性能影响和用途也有很大不同,您需要一些时间才能了解这些差异。在撰写本文时(2013 年 1 月 10 日),Nvidia 和 Udacity 似乎正在提供计算着色器课程的介绍,这可能是加快速度的好方法。

FWIW,您还需要用于计算着色器的非常现代的硬件,这可能会限制您的观众。

于 2014-01-11T19:09:32.757 回答