Gpu 处理后如何从图形卡读取信息?

Gpu 处理后如何从图形卡读取信息?,gpu,Gpu,例如,假设我有一个10x10“cloth”网格,每个正方形是两个三角形。现在,如果我想制作动画,我可以在CPU上进行弹簧计算。每个顶点都会有自己的“弹簧”数据,并且很可能会像它应该表示的任何类型的“布料”一样反弹 然而,这将涉及至少约380?每帧的弹簧计算。令人高兴的是,逐顶点计算是“令人尴尬的并行”——如果每个顶点有一个CPU,每个顶点都可以在一个CPU上运行。因此,从理论上讲,GPU是在计算机上运行此类计算的最佳选择 除了(这是使用DirectX/SlimDX)-我不知道/不确定我会/应该如

例如,假设我有一个10x10“cloth”网格,每个正方形是两个三角形。现在,如果我想制作动画,我可以在CPU上进行弹簧计算。每个顶点都会有自己的“弹簧”数据,并且很可能会像它应该表示的任何类型的“布料”一样反弹

然而,这将涉及至少约380?每帧的弹簧计算。令人高兴的是,逐顶点计算是“令人尴尬的并行”——如果每个顶点有一个CPU,每个顶点都可以在一个CPU上运行。因此,从理论上讲,GPU是在计算机上运行此类计算的最佳选择

除了(这是使用DirectX/SlimDX)-我不知道/不确定我会/应该如何:

1) 将所有这些顶点数据发送到图形卡(是的,我知道如何渲染东西,甚至编写了我自己的逐像素和纹理混合全局照明效果文件;但是,每个顶点必须能够访问至少三个其他顶点的位置数据)。我想我可以在TextureWord中粘贴相关的顶点位置和顶点位置的数量,但可能会有不同的标准解决方案

2) 之后读取所有顶点数据,以便更新内存中的网格。否则,每次更新都会对完全相同的数据执行操作,从而得到完全相同的结果,就像在需要2+3=5、2+3=5、2+3=5时添加2+3=5-2=3+1.5=4.5一样

这可能是因为我看错了方向


谢谢。

您可以使用您描述的方法将数据打包到纹理中,并编写特殊的HLSL着色器来计算弹簧力,然后更新顶点位置。这种方法完全有效,但在尝试调试问题时可能会很麻烦,因为您使用的是非传统方式的纹理像素(您可以绘制纹理,也可以编写一些代码来查看给定像素中的值)。从长远来看,使用像CUDA、DirectCompute或OpenCL这样的东西可能更容易。CUDA允许您“绑定”DirectX顶点缓冲区,以便在CUDA中进行访问。然后在CUDA内核中,您可以使用位置计算力,然后在渲染更新的位置之前将新位置写入顶点缓冲区(在GPU上并行)。 在DirectX 10/11 DirectX SDK中有一个使用DirectCompute的cloth演示