我目前正在使用CUDA在3D三角网格(基本上任何形状)上开发3D热流模拟。
我在考虑使用CUDA纹理或曲面来利用空间局部性。由于我有3D网格,我认为3D纹理是合适的。然而,在查看不同的示例之后,我不再那么确定了: 3D纹理通常用于不用于表面的卷。
我可以将3D纹理用于多边形网格吗?是否有意义?如果没有,CUDA中是否有其他方法或数据结构用于我的案例?
答案 0 :(得分:2)
使用3D纹理存储表面网格实际上是一个好主意。为了更好地指出这一点,让我回想一下
中的聪明方法Octree Textures on the GPU, GPU Gems 2
使用2D和3D网格存储OctTree和
通过3D纹理的过滤特征进行OCTTREE TRAVERSAL
树存储为8
位RGBA 3D纹理,映射在单位多维数据集[0,1]x[0,1]x[0,1]
中,命名为间接池。树的每个节点都是间接网格。每个子节点由RGBA的前三个坐标标识,而第四个子节点存储一些其他信息,例如,如果节点是叶子或者是否为空。
考虑报告中报告的QuadTree示例(从论文借来的数字)。
A
,B
,C
和D
个节点(框)存储为纹理元素(0,0)
,(1,0)
,{ {1}}和(2,0)
分别包含QuadTree (3,0)
个元素,每个元素存储一个到子节点的链接。通过这种方式,可以通过利用纹理存储器的硬件过滤功能来完成对树的任何访问,这种可能性如下图所示:
并通过以下代码(它是用Cg编写的,但我确信它可以很容易地移植到CUDA):
通过2D纹理存储树元素
可以通过利用4
坐标的经典方法存储树的元素,请参阅UV mapping。上面链接的论文讨论了一种改进这种方法的方法,但这超出了这个答案的范围。