• Unity3d BTDF实时折射模拟有粗糙度的半透明物体




    折射的原理是运用BTDF的一个球形高斯近似

    需要考虑折射光的来源,一般会想到用环境贴图(IBL)或者grab texture,但是折射光不全都来自一个平面,所以选择环境贴图来作为折射光。
    这个效果主要是BTDF计算折射光,和BRDF计算物体的反射光,二者加和即是最终结果。

    我们需要用到的参数
     


    我们的最终实现公式为:
     
    fr是BRDF,ft是BTDF。

    Fr

    我们首先复习一下BRDF,因为BTDF也要用到BRDF的知识。详细BRDF请看这篇:Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF
    BRDF来模拟真实世界光照主要是做到能量守恒,我们通过一些渲染模型来实现。
    比如镜面反射模型:Phong,Blinn-Phong
    漫反射模型:Lambert,Oren-Nayar

    根据Mircofacet模型,fr的镜面反射公式为:
     
     
    Mircofacet模型是假设平面上有无数方向不同(粗糙度)的光滑的微平面,以此来模拟粗糙度的反射

    其中:
    D项代表Normal Distribution Function,法线分布函数
    表示Mircofacet中心法线和半球内任意方向(half-vector)朝向的分布概率

    F项表示Fresnel函数
    菲涅尔反射简单说就是物体表面的反射程度,与你的视线和物体表面法线夹角的大小所成的关系,视线与法线的夹角越小,反射率越低,就越容易看出物体本身的固有色和纹理,相反夹角越大,反射程度也就越大。

    G项为几何衰减项(Geometry Attenuation Factor)
    考虑被Mircofacet微平面遮挡的入射/反射光的数量函数(Visibility函数)

    Ft

    Fr解决了,我们再来看Ft的公式
     

    ωi为入射光线,ωo为出射光线也就是反射光线
     

    ωht为折射的半角向量
     

    F,D,G是与BRDF相同的,但是注意传入参数不同

    在G项与D项通过加入变量kG,kD来加入粗糙度

    kG为:
     
    kD为可变变量控制粗糙度
    由此改进的D函数为
     

    结果

    把二者加在一起,
    测试引擎:Unity 5.0


    参考:Real-Time Rough Refraction

    博主近期渲染:2016的渲染

                                  ---- by wolf96 






  • 相关阅读:
    关于一个单机游戏发行的一些见解
    怎么租借电话号码
    NUMA架构的优缺点
    Windows 安装PostgreSQL
    Oracle查询当前用户下的所有表及sqlplus 设置 列宽
    Xshell调整终端显示的最大行数(缓冲区)
    PostgreSQL 索引膨胀
    Linux 清空缓存
    load多个数据文件的yaml
    Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)
  • 原文地址:https://www.cnblogs.com/zhanlang96/p/5331588.html
Copyright © 2020-2023  润新知