Opengl 在CUDA中,如何在核函数中将屏幕空间坐标转换为世界空间坐标

Opengl 在CUDA中,如何在核函数中将屏幕空间坐标转换为世界空间坐标,opengl,cuda,coordinate-transformation,raycasting,Opengl,Cuda,Coordinate Transformation,Raycasting,在这里,我尝试将光线投射添加到真实的3D场景中。我们知道,在光线投射中,为了投射光线,我们需要得到光线的方向。光线中的第一个点是光线的起点,我可以从glLookAt中得到。光线中的第二个点是屏幕中的每个点。在原来的CUDA ray casting SDK中,它通过下面的代码获得内核函数中的屏幕点: uint x = blockIdx.x*blockDim.x + threadIdx.x; uint y = blockIdx.y*blockDim.y + threadIdx.y; (x,y)屏幕

在这里,我尝试将光线投射添加到真实的3D场景中。我们知道,在光线投射中,为了投射光线,我们需要得到光线的方向。光线中的第一个点是光线的起点,我可以从glLookAt中得到。光线中的第二个点是屏幕中的每个点。在原来的CUDA ray casting SDK中,它通过下面的代码获得内核函数中的屏幕点:

uint x = blockIdx.x*blockDim.x + threadIdx.x;
uint y = blockIdx.y*blockDim.y + threadIdx.y;
(x,y)屏幕空间坐标正确吗?现在我需要将(x,y)转换成世界空间坐标。一个好人告诉我用GlunProject做这项工作。好主意!但是我不能在CUDA内核中调用OpenGL函数


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

我的解决方案是这样的:在CUDA内核中,它通过以下方式获取屏幕坐标:

uint x = blockIdx.x*blockDim.x + threadIdx.x;
uint y = blockIdx.y*blockDim.y + threadIdx.y;
实际上,它代表屏幕垂直于Z轴的另一个坐标空间。从透视图上,我们还可以得到屏幕和视图位置之间的距离。因此,当我们知道视图位置时,我们可以计算屏幕的Z坐标。所以屏幕上每个点的坐标是(x,y,z)在这个特定的坐标空间下

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

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


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

你想要什么帮助并不那么明显。是转换的数学,还是数学的CUDA实现,还是什么?也许您可以先编写一段执行转换的串行主机代码并确认其正确性,然后研究如何将计算映射到CUDA执行模型的问题。您可以查看
glunProject()
的源代码,并在CUDA代码中实现它。这个问题与CUDA完全正交——您需要的只是数学,然后是每个线程执行的C代码。