处理后如何从显卡上读取信息?

时间:2011-09-08 18:40:34

标签: gpu-programming

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

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

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

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

2)之后读取所有顶点数据,这样我就可以更新内存中的网格。否则,每次更新将对完全相同的数据采取相同的结果,就像添加2 + 3 = 5,2 + 3 = 5,2 + 3 = 5时所需的是2 + 3 = 5 - 2 = 3 + 1.5 = 4.5。

可能我正在朝着错误的方向去做这件事。

感谢。

1 个答案:

答案 0 :(得分:1)

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