我正在尝试使用 WebGL 和 GLSL 着色器编程在 GPU 上实现有效的流体求解器。

我发现了有趣的文章:
http://http.developer.nvidia.com/GPUGems/gpugems_ch38.html

请参阅: 38.3.2 板操作

我想知道这种强制边界条件的技术是否可以通过乒乓渲染实现?
如果我只渲染线条,那么纹理的内部呢?
我一直认为必须将整个输入纹理复制到临时纹理(在该过程中更新 ofc 边界),因为它们在该操作后被交换。

这很有趣,特别是考虑到 示例 38-5 的事实。边界条件片段程序 (可视化:http://i.stack.imgur.com/M4Hih.jpg)显示了恕我直言需要乒乓技术的方案。

你怎么看?我误解了什么吗?

一般来说,我发现纹理写入非常昂贵,这就是为什么我想以某种方式限制它。不幸的是,乒乓技术强制执行大量纹理写入。

最佳答案

我实际上已经实现了该章节中描述的技术,使用 FrameBuffer objects 作为渲染到纹理方法(但在桌面 OpenGL 中,因为当时 WebGL 不存在),所以这绝对是可能的。不幸的是,我不相信我有代码了,但是如果你用 [webgl] 标记你 future 的任何问题,我会看看我是否可以提供一些帮助。

您将需要每帧乒乓数次(文章提到了五个步骤,但我似乎记得确切的数量取决于您想要的模拟质量和您的确切边界条件)。使用 FBO 比写这篇文章时效率高很多(作者提到使用 GeForce FX 5950,这是前一段时间),所以我不会担心他在文章中提到的开销。只要您不将数据带回 CPU,您就不应该发现在纹理和帧缓冲区之间切换的成本太高。

如果您的边界只有一个像素厚,您将有一些泄漏,但这可能会或可能 Not Acceptable ,具体取决于您渲染结果的方式和流体速度。使边界更厚可能会有所帮助,并且自这篇论文以来已经撰写了一些论文,它们探索了将流体限制在边界内的不同方法(我还记得一些关于更有效的扩散/压力求解器的文章,您可能会在拥有这些后查看它们)版本有效……如果您搜索 papers that cite the GPU gems article on google scholar ,您会发现一些有趣的后续内容)。

附录:我不确定我是否完全理解你关于边界的问题。关键是你必须在你想要成为边界的每个像素上运行一个着色器,但该像素如何到达那里并不重要,无论它是用线、点还是三角形绘制的(只要它的输入是正确的)。

在非常一般的情况下(如果您只有有限数量的边界基元,这可能不适用),您可能必须绘制一个覆盖帧缓冲区的四边形,因为与速度和压力场的相互作用更加复杂(任何周围的像素可能是另一个边界像素,而不是简单定义的边缘)。有关如何执行此操作的一些说明,请参阅第 38.5.4 节(任意边界)。如果某些东西不是边界,您将不会触及向量场,如果是,则不是硬编码要查看的方向以求和向量值,您可能最终会测试周围的像素并仅求和那些不是边界的,以便您可以强制执行边界条件。

10-08 16:55