ren*_*ger 1 opengl gpu physics
我想建立一个程序,让用户绘制一个机翼轮廓,然后对该轮廓周围的空气进行实时模拟.计算将在GPU上完成.
我为这个程序做了一个设计,你可以在这个丑陋的MS Paint绘图中看到:
着色器程序2使用纹理1,它是粒子网格,进行碰撞检测,并将其渲染到纹理2.然后程序1使用更新的网格,计算时间步长,并将其渲染为帧缓冲对象1中的纹理1.偶然程序3将此纹理渲染到屏幕上.
我失去了以一种不完全停止gpu的方式将信息传回客户端的步骤.我唯一想回来的就是机翼上产生的升力.每当粒子与机翼碰撞时,它就会将动量传递给机翼.我需要一种方法来添加所有那些微小的动量,并在多个帧上计算机翼上的平均力.
我不相信这个问题是一个非常适合该网站,因为它非常本地化,但仍然是太开放的结果,但让我通过它无论如何,因为GPU加速流体模拟是我的高级项目,让我们面对它,它是真的很有趣.
首先,我建议不要在OpenGL中完成所有这些操作,而是选择OpenCL.它是为一般计算而设计的,因此您可以更轻松地以合理的,特定于域的方式来回获取数据(例如,您不必考虑纹理和所有特定于图形的爵士乐) .
如果您使用OpenGL进行渲染并使用OpenCL进行计算,则可以共享一些缓冲区以避免从上下文到另一个上下文的不必要副本.我将计算OpenCL缓冲区中的所有粒子位置,与OpenGL共享该缓冲区并使用几何着色器发出构成流体渲染的图形基元.
其次,你必须接受从GPU获取数据总是很昂贵.如果你可以避免在主机上需要它,那就这样做吧.否则,你几乎有两个选择:
particle_count读入主机内存,然后在CPU上求和.sizeof(force_type)使用大小缓冲区对GPU上机翼上的力进行求和,atomic_add并将其读取到主机内存中.选项2可能比选项1更快,或者它可能会更慢,具体取决于从您拥有的粒子数量到图形驱动程序的大量因素,因此您需要进行实验和基准测试(这通常是您想要的事情)做这样的GPGPU时一直都在做).
你在2个纹理之间交替的想法是一种非常好的洞察力.它将允许您避免与"剪切"数据相关的问题(某些粒子已更新,但有些粒子未更新).您应该始终从单个缓冲区读取并写入另一个缓冲区.当然,这将花费您将使用的VRAM数量.
最后,如果您想了解我们在OpenCL中如何亲自完成它,请查看libclsph.请记住,它根本不是生产准备,碰撞系统是一个可怕的近似(充其量),它表明它是一个学生项目.它还面向图形和外部渲染器,因此我们将粒子写入文件,我们不计算环境的力量.然而,这是一个很好的开始例子,说明如何在OpenCL中进行流体模拟.
如果您需要更多信息并祝您好运,请告诉我.有很多事情要考虑,但这是一个很酷的项目!