如何将物理从几何着色器整合到程序生成的世界中?


10

本质上,我想消除从CPU到GPU产生相干噪声的需要。从那里,我还想使用此噪声作为体素点的密度来生成三维世界的地形。在此之后,我想获取这些密度并将它们代表世界的地形多边形化(生成顶点)。

一切都很好。但是,我也想实时地动态改变世界。一旦达到这一点,尝试将顶点返回给CPU来执行诸如碰撞检测之类的事情,以及我想涉及CPU而不是GPU的所有游戏计算等问题。

所以问题是:如何将顶点的子集返回给CPU以处理冲突?

还有一个问题:是否有一种简单的方法来获取一组顶点并在GPU上从中生成索引?

对于这些不同的东西应该使用哪种着色器,我感到困惑。我听说有人使用像素着色器来收集密度,然后使用几何着色器来处理从顶点生成的地形,然后以某种方式合并顶点着色器来进行动态变形。

我正在使用C#4.0,.NET 4.0和XNA Game Studio 4.0。


1
您说您在标题中使用了几何着色器,但是您也说您在使用XNA4.0,据我所知XNA 4.0需要DirectX 10(以便更轻松地开发更统一的平台),但是仅支持SM3.0功能,因此没有几何着色器。forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.

现在,我将不再使用XNA或重新设计。感谢您指出了这一点。我一直在研究它,但没有意识到这个限制(没有SM 4)。我想这个问题仍然存在,但不考虑XNA。因此,从仅DirectX的角度来看,有没有办法做我想做的事情?还是在XNA中使用顶点着色器?

1
XNA仍然可以有效使用,除非您有一个经过验证的测试用例,在此情况下变形和生成速度太慢。而且您已经在另一个测试案例中证明了GPU变形+生成,然后将数据返回给CPU的速度更快:)
Roy T.

确实。我们发现,使用XNA并将所有内容保留在CPU上,在具有8个内核和8个线程的Core i7上,大约三分钟内可以为我们提供约100万个顶点,每个线程并行处理多个地形。当尝试实时进行操作并希望在玩家看到地形之前进行渲染时,我们获得了每秒约20帧的效果。因此,每种方法肯定都需要一个测试用例。
Michael J. Gray

Answers:


3

由于XNA不支持几何体着色器,因此我将像使用DX 10一样回答它。您实际上有三个选择。

几何着色器 几何着色器实际上可以修改顶点并将其添加到顶点缓冲区。您可以将其读回CPU。我没有研究过,但是绝对有可能。

只需使用CPU 其次,为什么不只在CPU上计算呢?它在着色器中的GPU上运行的事实表明您的变形算法是可本地化的,即,您可以轻松生成仅相关零件以进行碰撞检查。

例如,我前段时间做了一个帆船比赛。海洋使用顶点和几何着色器通过波使水变形。我在船下面的几个点上使用了CPU上计算出的相同算法,以使船在波浪中运动。我确定您可以对体素贴图执行类似的操作。

像素着色器 最后一个选项,您在问题中也提到了这一点:在像素着色器中生成密度并将其写入3D纹理。您可以从CPU和着色器无害地访问它。像素着色器非常适合此任务,但是此方法有很多开销。渲染体积纹理,以及在顶点和地理区域中进行采样。着色器,并且必须将纹理读取到CPU上。

我不知道您项目的细节,但是我会一直使用CPU。一定要计算着色器上的密度,但要坚持使用图形卡进行渲染。


我们遇到的主要问题是GPU-CPU障碍。从某种意义上说,一旦我们在GPU上生成并渲染了地形,我们如何确定事物在CPU端的地形是什么样,以便进行碰撞和其他事情。我想您关于将其保留在CPU上的想法是正确的。我的意思是,我们可能可以对算法进行相当多的优化,并生成更少的地形。我会在一两天内将您的回复标记为解决方案,以查看是否有人回应。感谢您提出一些其他想法。
Michael J. Gray

在您的航行示例中,您将无法轻松将通过波溅出的船只的波形结果连接到GPU,对吗?
deceleratedcaviar

1
您可以保持相同的渲染系统,即在GPU上生成和渲染地形,但可以在CPU上镜像所需的地形部分。使用相同的算法和相同的参数,您将在CPU上获得与在屏幕上看到的相同的地形。
汉尼斯,2011年

@Daniel不能直接使用wave算法,但是可以根据船的尾迹使水网格变形,并带有位移纹理,每条船都“拖曳”在其后面。
汉尼斯2011年

啊! 这是一个好主意 :)。但是它可能不能很好地支持多种船只。
deceleratedcaviar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.