2012-05-25 72 views
0

在这里,我试图将光线投射添加到真实的3D场景中。我们知道,在光线投射中,为了投射光线,我们需要得到光线的方向。射线中的第一点是我可以从glLookAt得到的射线的起点。射线中的第二点是屏幕上的每个点。在原来的CUDA光线投射SDK,它通过下面的代码获取内核功能的屏幕点:在CUDA中,如何将屏幕空间坐标转换为内核函数中的世界空间坐标

uint x = blockIdx.x*blockDim.x + threadIdx.x; 
uint y = blockIdx.y*blockDim.y + threadIdx.y; 

(X,Y)的屏幕空间坐标吧?所以现在我需要将(x,y)翻译成世界空间坐标。一个不错的人告诉我使用gluUnProject来完成这项工作。好想法!但是我不能在CUDA内核中调用OpenGL函数。

也许我可以使用可逆矩阵做翻译。但我不确定正确的方法。有没有人可以给我一个关于如何在CUDA内核函数中将屏幕坐标转换为世界坐标的提示?

+3

这并不是所有你想要的帮助。它是转换的数学,还是数学的CUDA实现还是什么?也许你可以先写一连串执行转换的主机代码并确认它是正确的,然后看看如何将计算映射到CUDA执行模型的问题。 – talonmies

+1

您可以查看'gluUnproject()'的源代码并在CUDA代码中实现它。这个问题与CUDA完全正交 - 你需要的仅仅是数学,然后是C代码,它们将由每个线程执行。 – harrism

回答

1

我的解决办法是这样的:在CUDA内核,它会在这样的屏幕坐标:

uint x = blockIdx.x*blockDim.x + threadIdx.x; 
uint y = blockIdx.y*blockDim.y + threadIdx.y; 

其实它的坐标空间,屏幕垂直于Z轴代表另一个。从gluPerspective中,我们也可以获得屏幕和视图位置之间的距离。所以当我们知道视图位置时,我们可以计算屏幕的Z坐标。所以在这个特定的坐标空间下,屏幕上每个点的坐标是(x,y,z)。

在这个特定的坐标空间中,视图方向平行于Z轴。另外,我们知道世界空间中的视角方向。因此,我们只需计算将Z轴对齐视图方向(特别是上面的坐标空间)转换为真实视图方向(在世界空间中)的转换矩阵。

然后我们使用这个矩阵将屏幕上的每个点(x,y,z)转换为世界空间。这就是世界空间坐标。

我现在试图实现这一点,我认为这个想法是可以的,实施后我会接受这个答案。

相关问题