我正在为我正在编写的 iOS 应用程序开始一个 Spherical Harmonics 着色器项目。我首先阅读了这篇关于该主题的优秀深入论文 (PDF) - http://bit.ly/aQmax3。
该论文描述了涉及光线投射的场景预处理步骤。有人可以描述如何在 iOS 上使用 GLSL 执行光线投射吗?
我正在为我正在编写的 iOS 应用程序开始一个 Spherical Harmonics 着色器项目。我首先阅读了这篇关于该主题的优秀深入论文 (PDF) - http://bit.ly/aQmax3。
该论文描述了涉及光线投射的场景预处理步骤。有人可以描述如何在 iOS 上使用 GLSL 执行光线投射吗?
如果您指的是该过程中用于确定哪些表面被环境光照射(用于环境光遮蔽着色)的光线投射,我已经在Molecules iOS 应用程序中完成了该操作。我在这篇博文和我提交给纳米技术会议的这篇论文中稍微谈到了这个过程,但我可以对此进行扩展。
在我的例子中,我使用深度测试来确定表面上被不同方向的环境光照射的区域。我拿我的模型并以一系列方向渲染它,这些方向对应于从对象周围球体上均匀分布的一组点看它的人。对于对象表面上的每个点,我通过测试其转换后的 Z 位置与为该点的可见表面计算的深度来确定该点是否从该方向可见。
我通过使用环境光遮蔽强度纹理来跟踪对象的许多方向上的这种可见性。我使用自定义着色器在此纹理上的位置和对象表面上的位置之间进行映射。如果该位置在该旋转中可见,我写出一个灰度值(值为 1 /(方向数)),如果隐藏,我写出黑色。然后我使用加法混合模式来累积这些值,以确定哪些表面被环境光照射的次数最多。
我的环境遮挡纹理如下所示:
在这种情况下,我将一系列球体映射为分子模型的一部分,因此该纹理中的每个矩形都是球体的表面积,使用映射函数将其展平。当包裹在实际模型中时,这些值如下所示:
此外,为了确定我的对象在不同方向的深度值,我必须创建自己的深度写入函数来计算每个像素的深度值并将其存储到自定义深度纹理中。然后,在确定环境光是否在某个方向上击中某个点时,我会从该纹理中读取。如果我没记错的话,您不能直接在 iOS 设备上从深度缓冲区中读取数据,因此您可能还需要为您的模型做类似的事情。
这不包括反射漫反射照明的情况,但它至少描述了我进行环境光遮蔽着色的方法。此应用程序的源代码可在上面的链接中找到,如果您想深入了解它并了解这一切在实践中是如何工作的。