GPGPU - 有效的乒乓技术?

4
我正在尝试使用WebGL和GLSL着色器编程在GPU上实现有效的流体求解器。
我发现了一篇有趣的文章: http://http.developer.nvidia.com/GPUGems/gpugems_ch38.html 请查看:38.3.2板块操作 我想知道在ping-pong渲染中是否可以使用此强制边界条件的技术?如果只渲染线,那么纹理内部怎么办?我一直认为整个输入纹理必须被复制到临时纹理(当然,在此过程中更新边界),因为它们在该操作之后进行交换。
特别是考虑到示例38-5。边界条件片段程序(可视化:http://i.stack.imgur.com/M4Hih.jpg)显示的方案需要使用ping-pong技术,这是很有趣的。
你觉得呢?我是否误解了什么?
总的来说,我发现纹理写入非常昂贵,这就是为什么我希望以某种方式限制它。不幸的是,ping-pong技术会强制执行大量的纹理写入。
1个回答

1

我实际上已经使用FrameBuffer对象作为渲染到纹理的方法(但是在桌面OpenGL中,因为当时还没有WebGL),所以这是完全可能的。不幸的是,我不认为我还有代码,但如果您将来有任何带有[webgl]标签的问题,我会尽力提供帮助。

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

如果你的边界只有一个像素厚,那么你可能会有一些泄漏,但这取决于你如何呈现你的结果以及流体的速度,这可能是可以接受的或不可接受的。增加边界的厚度可能会有所帮助,而且自此之后已经有很多论文探讨了不同的方法来限制流体在边界内(我还记得有一些关于更高效的扩散/压力求解器的论文,你可以在这个版本工作之后查看一下...如果你在谷歌学术上搜索papers that cite the GPU gems article,你会发现一些有趣的后续内容)。
补充说明:我不确定我完全理解你关于边界的问题。关键是你必须在你想要成为边界的每个像素上运行一个着色器,但它并不重要这个像素是如何到达那里的,无论是用线条、点还是三角形绘制的(只要输入正确)。
在非常一般的情况下(如果您只有有限数量的边界基元,则可能不适用),您可能需要绘制一个覆盖帧缓冲区的四边形,因为与速度和压力场的交互更加复杂(任何周围的像素都可能是另一个边界像素,而不是仅具有定义明确的边缘)。请参见第38.5.4节(任意边界)以了解如何执行此操作的一些说明。如果某些东西不是边界,则不会触及矢量场,如果是边界,则不会硬编码要查看哪些方向以总结矢量值,您可能最终会测试周围的像素并仅总结不是边界的像素,以便您可以强制执行边界条件。

我的主要关注点是这篇文章中描述的边界条件的特定应用。只有4条线被渲染,而不是四边形。我认为在乒乓渲染过程中这是不可能的,因为如果我在渲染后交换纹理,它必须完全填充,而不仅仅是在边界上(因此,使用四边形进行渲染,而不是线)。那么,是否可能只渲染4条线并使用一些技巧,还是必须使用四边形? - piotrek
看看我添加的内容是否有助于回答你的问题。 - Brendan Kenny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接