我正在尝试使用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)显示了IMHO需要乒乓技术的方案。
你怎么看?我误解了什么吗?一般来说,我发现纹理写入非常昂贵,这就是我想以某种方式限制它的原因。不幸的是,乒乓技术强制执行大量纹理写入。
答案 0 :(得分:1)
我实际上使用FrameBuffer objects作为渲染到纹理方法实现了该章中描述的技术(但是在桌面OpenGL中,因为WebGL当时不存在),所以它绝对可能。不幸的是,我不相信我已经拥有了代码,但是如果你用[webgl]标记以后的任何问题,我会看看能否提供一些帮助。
你需要每帧几次乒乓(文章提到了五个步骤,但我似乎记得确切的数字取决于你想要的模拟质量和你的确切边界条件)。使用FBO比编写它时效率更高(作者提到使用GeForce FX 5950,这是前一段时间),所以我不担心他在文章中提到的开销。只要您不将数据带回CPU,就不会发现在纹理和帧缓冲区之间切换的成本太高。
如果边界只有像素厚,则会有一些泄漏,但根据渲染结果的方式和流体的速度,这可能会或可能不会被接受。使边界更厚可能会有所帮助,并且有一些文章已经编写,因为这个文章探索了将流体限制在边界内的不同方法(我还记得一些关于更有效的扩散/压力求解器,你可能会在这之后检查出来版本工作...如果你搜索papers that cite the GPU gems article on google scholar),你会发现一些有趣的后续内容。
附录:我不确定我完全理解你关于边界的问题。关键是你必须在你想要成为边界的每个像素上运行一个着色器,但是这个像素到达那里并不重要,无论它是用线,点还是三角形绘制(只要它的输入是正确的。)
在非常一般的情况下(如果你只有有限数量的边界基元可能不适用),你可能不得不绘制一个覆盖帧缓冲区的四边形,因为与速度和压力场的相互作用更复杂(任何周围的像素可以是另一个边界像素,而不是简单地定义边缘)。有关如何操作的一些说明,请参见第38.5.4节(任意边界)。如果某些东西不是边界,你就不会触摸矢量场,如果是,那么你可能最终会测试周围的像素并且只能求和,而不是硬编码你要查看哪个方向来求和矢量值。那些不是边界的,以便你可以强制执行边界条件。