我正在为我正在编写的iOS应用程序开始一个球面谐波着色器项目。我首先阅读了这篇关于这个主题的优秀的深入论文-- http://bit.ly/aQmax3。
本文描述了一个涉及光线投射的场景预处理步骤。有人能描述一下如何在iOS上使用GLSL执行光线投射吗?
发布于 2012-04-26 02:38:09
如果您指的是在确定哪些曲面受到环境光(用于环境光遮挡着色)命中的过程中使用的光线投射,我已经在我的Molecules iOS应用程序中完成了该操作。我在提交给纳米技术会议的this blog post和this paper中谈到了这个过程,但我可以对此进行扩展。
在我的例子中,我使用深度测试来确定表面上被不同方向的环境光击中的区域。我将我的模型以一系列的方向渲染,这些方向对应于某个人从围绕对象的球体上均匀分布的一组点上看它。对于对象表面上的每个点,我通过测试其变换后的Z位置与为该点上的可见表面计算的深度来确定该点是否从该方向可见。
我通过使用环境光遮挡强度纹理在对象的许多方向上跟踪这种可见性。我使用自定义着色器在此纹理上的位置和对象表面上的位置之间进行映射。如果该位置在旋转中可见,我会写出一个灰度值(值为1/(方向数)),如果隐藏,我会写出黑色。然后,我使用加法混合模式来累积这些值,以便确定哪些曲面被环境光击中次数最多。
我的环境光遮挡纹理如下所示:

在本例中,我映射了一系列球体作为分子模型的一部分,因此该纹理中的每个矩形都是球体的表面积,使用映射函数将其展平。当围绕实际模型进行包装时,这些值如下所示:

此外,为了确定对象在不同方向的深度值,我必须创建自己的深度写入函数,该函数计算每个像素的深度值,并将这些值存储到自定义深度纹理中。然后,当我确定环境光是否击中方向上的点时,我会从这个纹理中读取。如果我没记错的话,你不能直接在iOS设备上读取深度缓冲区,所以你可能也需要对你的模型做类似的事情。
这不包括反射漫反射照明的情况,但它至少描述了我进行环境光遮挡着色的方法。这个应用程序的源代码可以在上面的链接中找到,如果您希望深入研究它并了解所有这些在实践中是如何工作的。
https://stackoverflow.com/questions/10316815
复制相似问题