0

我必须计算平面上镜子的可见度场(即:地板)。

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

在此处输入图像描述

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

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

在此处输入图像描述

现在整个过程都在 cpu 上运行,为了让它更快,最初的想法是在 OpenCL 上移动计算部分。

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

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

4

1 回答 1

2

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

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

然而,由于 GLSL 不是为 GPGPU 设计的,它确实需要大量的精力和时间。正确获取所有纹理坐标可能非常棘手。因此,如果您急于实现这一点,GLSL 可能不是要走的路。

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

于 2013-05-13T13:10:09.140 回答