使用CUDA纹理存储2D表面

时间:2014-01-17 22:43:25

标签: cuda simulation mesh

我目前正在使用CUDA在3D三角网格(基本上任何形状)上开发3D热流模拟。

我在考虑使用CUDA纹理或曲面来利用空间局部性。由于我有3D网格,我认为3D纹理是合适的。然而,在查看不同的示例之后,我不再那么确定了: 3D纹理通常用于不用于表面的卷

我可以将3D纹理用于多边形网格吗?是否有意义?如果没有,CUDA中是否有其他方法或数据结构用于我的案例?

1 个答案:

答案 0 :(得分:2)

使用3D纹理存储表面网格实际上是一个好主意。为了更好地指出这一点,让我回想一下

中的聪明方法

Octree Textures on the GPU, GPU Gems 2

使用2D和3D网格存储OctTree和

  1. 使用3D纹理创建OctTree;
  2. 通过利用3D纹理的过滤属性快速遍历OctTree;
  3. 通过2D纹理存储表面多边形。
  4. 通过3D纹理的过滤特征进行OCTTREE TRAVERSAL

    树存储为8位RGBA 3D纹理,映射在单位多维数据集[0,1]x[0,1]x[0,1]中,命名为间接池。树的每个节点都是间接网格。每个子节点由RGBA的前三个坐标标识,而第四个子节点存储一些其他信息,例如,如果节点是叶子或者是否为空。

    考虑报告中报告的QuadTree示例(从论文借来的数字)。

    Storage in texture memory of a QuadTree

    ABCD个节点(框)存储为纹理元素(0,0)(1,0),{ {1}}和(2,0)分别包含QuadTree (3,0)个元素,每个元素存储一个到子节点的链接。通过这种方式,可以通过利用纹理存储器的硬件​​过滤功能来完成对树的任何访问,这种可能性如下图所示:

    enter image description here

    并通过以下代码(它是用Cg编写的,但我确信它可以很容易地移植到CUDA):

    通过2D纹理存储树元素

    可以通过利用4坐标的经典方法存储树的元素,请参阅UV mapping。上面链接的论文讨论了一种改进这种方法的方法,但这超出了这个答案的范围。