4

我正在尝试使用 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)显示了恕我直言需要乒乓技术的方案。

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

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

4

1 回答 1

1

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

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

如果您的边界只有一个像素厚,您将有一些泄漏,但这可能会或可能不会接受,具体取决于您渲染结果的方式和流体的速度。使边界变厚可能会有所帮助,并且自这篇论文以来已经写过一些论文,它们探索了将流体限制在边界内的不同方法(我还记得一些关于更有效的扩散/压力求解器的文章,你可以在拥有这个之后查看版本工作...如果您搜索引用 google 学者上 GPU gems 文章的论文,您会发现一些有趣的后续行动)。

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

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

于 2012-07-24T19:19:43.477 回答