c opengl:我可以在gpu中计算法线吗? (CUDA)

时间:2012-10-22 13:29:58

标签: cuda gpu indices normals

我正在尝试访问内核中的last和next索引坐标。

ex:int idx = blockIdx.x * blockDim.x + threadIdx.x;

然后pos [idx] .x,pos [idx] .y,pos [idx] .z将给出一个点的当前坐标。但无法访问其他两个。我正在尝试使用CUDA计算GPU级别中变化三角形的法线。

2 个答案:

答案 0 :(得分:0)

你仍然可以做idx + 1,idx + 2,GPU可以访问所有共享内存

为了获得最佳效率,你必须要小心谨慎,将你的工作划分为块/线程等,以便附近点的内存位于同一核心。

答案 1 :(得分:0)

在GPU上计算法线的容易程度取决于网格拓扑。

使用三角形列表拓扑计算网格的法线很容易:每个三角形使用一个GPU线程。这会导致高度规则的读取和写入,并且可以用于CUDA中任何有效的块和线程配置。不幸的是,三角形列表拓扑结构并不是非常有用(对于初学者来说,它将是平面阴影,除非采用一些额外的处理)。

使用三角形条带拓扑(通常使用)来计算网格的法线非常困难。问题是顶点用于多个三角形,因此您必须通过组合多个三角形法线来累积每个顶点法线的[加权]平均值。使用每个三角形一个GPU线程意味着多个顶点规范将受到多个GPU线程的影响"同时"。或者,使用每个顶点一个GPU线程意味着需要引用该顶点的三角形列表,然后需要读取三角形(附加顶点对),以便可以计算顶点范数......这很难,但并非不可能。

最后,如果您的模型使用索引顶点,则会进行额外的[半随机]查找,这可能会导致问题。可以使用空间分区解决此问题。