每顶点反射和交叉计算,OpenCL vs GLSL

时间:2013-05-13 09:33:09

标签: opengl reflection glsl intersection

我必须计算飞机上镜子的可见性区域(即:地板)。

镜面由几个三角形组成(最多可达数千个)。

enter image description here

每个顶点定义一个镜像点,每个镜像点可以对应6个三角形顶点并具有法线。

为了做到这一点,我应该计算一个特定点之间的线,代表驱动头(所有蓝线来自哪里),以及位于镜面上的每个镜像点(在右边的图像中)侧)。然后,对于这些点中的每一个,我应该基于第i条蓝线和第i条法线的方向计算它们的反射(黄线),因此计算第i条黄线和地板之间的交点。 显然,在此过程中,需要测试蓝色和黄色线与车辆几何形状的任何交叉点。

enter image description here

现在整个过程在cpu上运行,为了使它更快,有一些近似值,最初的想法就是在OpenCL上移动计算部分。

我来自Cuda环境(你知道OpenCL非常相似),我学习了OpenGL,现在我开始发现GLSL ..

鉴于我认为GLSL与Cuda / OpenCL相比有一些限制,但它更快且兼容性更广,是否有可能在GLSL中实现我所需要的?如果是,它是否有任何问题/限制如此强大以至于可能不值得?

1 个答案:

答案 0 :(得分:2)

要使算法与GPGPU(图形处理单元上的通用计算)配合良好,您需要能够根据矩阵或向量表达您需要计算的内容,以便获得{{3 }}。这是来自SIMD的好文章。

在快速浏览一下您对计算的描述后,我觉得您应该能够做到这一点。您可以使用纹理传输输入数据(如镜像点),也可以使用纹理传输输出数据。但是,单个点或向量可以作为GLSL统一向量发送。

然而,由于GLSL不适用于GPGPU,因此需要花费大量的精力和时间。获得所有纹理坐标可能非常棘手。所以,如果你急于实现这一点,那么GLSL可能就没有了。

尝试在GLSL中进行通用计算时可能遇到的一个限制是,在某些平台上,您无法访问浮点纹理,有时您只能存储整数值。 (要将数据导入GLSL着色器,可以将矢量或矩阵存储为纹理)。具体来说,我使用的是iPhone 3GS,我不知道以后的版本。