iOS GLSL球面调和着色器。如何使用iOS GPU进行Raycast

时间:2012-04-25 13:34:24

标签: ios opengl-es glsl raycasting pixel-shading

我正在为我正在编写的iOS应用程序开始一个Spherical Harmonics着色器项目。我已经开始阅读这篇关于这一主题的优秀深度论文(PDF) - http://bit.ly/aQmax3

该论文描述了涉及光线投射的场景预处理步骤。有人能描述如何在iOS上使用GLSL执行光线投射吗?

1 个答案:

答案 0 :(得分:2)

如果您指的是在该过程中使用的光线投射来确定哪些曲面被环境光线照射(对于环境光遮挡着色),我已经在我的Molecules iOS应用程序中完成了。我稍微谈谈了我为纳米技术会议提交的this blog postthis paper过程,但我可以对此进行扩展。

就我而言,我使用深度测试来确定在不同方向上被环境光击中的表面上的区域。我采用我的模型并将其渲染为一系列方向,这些方向对应于从围绕对象的球体上的均匀分布的点集中查看它的人。对于物体表面上的每个点,我通过测试其变换的Z位置与在该点为可见表面计算的深度来确定该点是否从该方向可见。

我通过使用环境遮挡强度纹理来跟踪对象的多个方向上的这种可见性。我使用自定义着色器在此纹理上的位置和对象表面上的位置之间进行映射。如果该位置在该旋转中可见,我会写出灰色值(值为1 /(方向数)),如果隐藏,则写出黑色。然后,我使用添加剂混合模式来累积这些值,以确定哪些表面被环境光照射的次数最多。

我的环境遮挡纹理如下所示:

Ambient occlusion texture

在这种情况下,我将一系列球体映射为分子模型的一部分,因此该纹理中的每个矩形都是球体的表面区域,使用映射函数展平。当包裹在实际模型中时,这些值如下所示:

Mapped ambient occlusion values

此外,为了确定我的物体在不同方向的深度值,我必须创建自己的深度写入功能,计算每像素深度值并将其存储到自定义深度纹理中。然后,当确定环境光是否到达方向上的点时,我从该纹理中读取。如果我没记错的话,你无法直接在iOS设备上读取深度缓冲区,所以你可能需要为你的模型做类似的事情。

这不包括反射漫射照明的情况,但它至少描述了我进行环境遮挡着色的方法。如果你想深入了解这个应用程序的源代码,可以在上面的链接中找到它,看看这一切是如何运作的。