我有一个(基本)voxel发动机运行和一个看起来(和我假设基本上有效)的水系统: https://www.youtube.com/watch?v=q_tdegioots (不是我的游戏)。
水值存储在浮子的3D阵列中,每0.05秒通过检查下面的体素和相邻的体素(Y-1,X-1,X + 1,Z-1,Z + 1)并添加到水流来计算水流价值。
该系统适用于少量水(70+ FPS),但是当我在8+块中开始计算水时,它会变得太多。 (我禁用所有渲染或网格创建以检查这是瓶颈,IT不是。它纯粹是流量计算)。
我不是一个非常经验的程序员,所以我不知道在哪里开始优化,除了在我已经做的计算中发生了计算。
在此帖子中: https://gamedev.stackexchange.com/questions/ 55414 /如何定义区域填充 - 用水(靠近底部)Boreal建议在 compute着色器中运行它。这是为了我的方式吗?我怎么样怎么样?
任何帮助都非常感谢。

有帮助吗?

解决方案

如果您真正计算基于体素的仿真,您将在几何上扩展计算数量,因为大小增加,因此您将在更大的卷上快速耗尽处理电源。

计算着色器很棒,虽然它是一个非常不同的编程范例,但需要一些习惯。计算着色器将查看缓冲区的内容(即美国平民的“纹理”),并非常快速地对其进行操作 - 在您的情况下,缓冲区可能是一个缓冲器/纹理,其像素值代表水电池。如果你想做一些真正简单的事情,如向上或向下增加它们,计算着色器使用GPU的并行处理能力来真正快速地完成。

硬部分是GPU是优化并行处理。这意味着您无法编写“texela.value += texelb.value”的代码 - 没有额外的工作,缓冲区的每个片段都被处理,并为其他片段中发生的事情进行了零知识。要引用其他特征,您需要以某种方式再次读取纹理 - 有些技术通过偏移量多次读取一个纹理(此gl示例是否可以实现模糊,其他人通过重复处理纹理,将结果放入临时纹理,然后重新处理。

在10,000英尺级别:是的,计算着色器是这种问题的一个好工具,因为它涉及大量的自我相似的计算。但是,蝙蝠不容易。如果您之前没有进行传统着色器编程,则可能希望将第一个习惯GPU工作方式。即使是真正的基本工具(如果 - 那么 - else或循环)对GPU编程中的绩效影响和用途具有非常不同的绩效影响,并且需要一些时间才能围绕差异。就像这种写作一样(1/10/13)看起来像 nvidia和udacity都提供了计算的介绍着色课程这可能是起动速度的好方法。

fwiw您还需要漂亮的现代硬件,用于计算着色器,可能会限制您的受众。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top