【GPU Gems 学习笔记】Rendering Water Caustics

本文探讨了GPU Gems中关于水焦散的渲染技术,包括折射焦散的原理和实时实现方法。通过对斯涅尔定律的应用,以及对海底和水面的渲染,模拟出逼真的水体效果。文中详细介绍了计算过程,如正弦波法线计算和纹理采样坐标确定,展示了Unity实现的最终效果。
摘要由CSDN通过智能技术生成

一. 水的焦散

焦散(Caustic),是一种光学现象,是由于光线在曲面经过反射或折射后形成的聚光效果,类似于凸透镜效果。


对于不透明物体来说,当光线照射到具有强反射属性的曲面对象时,会形成反射焦散现象;而当光线照射到透明物体时,如流动的水或玻璃杯,通过折射后形成聚光的折射焦散现象。

                 


同理,对于水体来说,焦散效果不是在水面产生。一部分光线在水表面发生折射,穿透水面在水底形成折射焦散。另一部分光线被水面反射,可以在墙壁等平面形成反射焦散。

本章内容主要介绍了从美学的角度出发,来实时渲染水下的折射焦散的方法。
 

二. 原理与实现

光线入水后发生一次折射后继续前进,随着入水深度的增减,光强度逐渐减弱。最后,一部分光子经过不同路径,碰到了海底相同的区域并将其照亮,形成明亮的光斑,类似于凸透镜的聚光现象。无论是基于光线追踪还是逆向光线追踪的方法来实现,都非常的费时,因为只有极小部分的计算对最终结果有实际意义。

为了方便计算焦散,大胆假设:
       1. 我们是在赤道上计算正午的水面焦散,这意味着太阳处于头顶正上方;
       2. 对焦散效果做出贡献的光线与海底垂直。
          (光线从入水到碰到海底,传播距离最短的光线,才容易形成焦散,其余的被介质吸收化成热量发散)

具体实现步骤分为两步:
      1. 绘制海底底面:
            a. 假设有一道垂直于该顶点的折射光线;
            b. 找到该折射光线与水面的交点;
            c. 计算交点的法向量
            d. 逆向使用斯涅尔定律(Shell)计算入射光线;
               (书中代码并没有计算入射光线,而是使用了水面顶点法线方向和水面顶点与水底的距离做为采样坐标)
            d. 使用入射光线作为纹理坐标对"太阳"贴图采样,采样结果为焦散的强度;
      2. 渲染水表面。

代码如下,首先是申明两个Pass,分别绘制了海底和水面&#

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值