我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
          • 7. 几何衰减因子
            • 7.1 定义
            • 7.2 Torrance-Sparrow
            • 7.3 Schlick-Beckmann
          • 8. 菲尼尔反射方程
            • 8.1 定义
            • 8.2 Schlick
            • 8.3 导体和绝缘体
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

微表面理论(三)


7. 几何衰减因子

7.1 定义

一束光线照射到微平面上,在到达之前或者反射之后,有可能被其他微平面阻挡,这种阻挡造成族中出射光线的衰减,可以用几何衰减因子G描述这种衰减程度

7.2 Torrance-Sparrow

以入射光线被阻挡为例,计算衰减因子G

根据上图可知

sin⁡α=1y

根据正弦定理

xsin⁡γ=2sin⁡(β+π/2)

联立以上两式,可以得到入射光线的有效比例为

G1=xy=2sin⁡γsin⁡αsin⁡(β+π/2)

其中

sin⁡α=n→⋅h→sin⁡(β+π/2)=cos⁡β=v→⋅h→sin⁡γ=n→⋅l→

所以可以求得

G1=2(n→⋅h→)(n→⋅l→)v→⋅h→

同理,反转v→和l→,可以求得反射光线被微表面阻挡的情况

G2=2(n→⋅h→)(n→⋅v→)v→⋅h→

所以光线受几何衰减因子的影响共有三种可能性,完全不受影响,照射光被阻挡,反射光被阻挡,最终的表达式为

G(l→,v→,h→)=min{1,G1,G2}=min{1,2(n→⋅h→)(n→⋅l→)v→⋅h→,2(n→⋅h→)(n→⋅v→)v→⋅h→}

7.3 Schlick-Beckmann

在Unreal Engine中,使用了这种模型,在这种模型中

G(l→,v→,h→)=G1(l→)G1(v→)G1(v→)=n→⋅v→(n→⋅v→)(1−k)+k

在原始的Schlick算法中,定义

k=α2π

在Unreal实现中,调整为

k=α2

根据所计算的光源的不同,α的定义也不同,当使用间接光源(IBL)时

α=roughness2k=roughness22

使用直接光源时,

α=(roughness+12)2k=(roughness+1)28

8. 菲尼尔反射方程

8.1 定义

当入射光线碰到一个反射平面时,菲尼尔反射方程会根据观察角度计算出反射光线所占的比例。当光线垂直入射时,材质反射的光线的比例称为基础反射率(Base Reflectivity),一般用F0表示,随着入射角的增大,反射的比例会增加,这种现象被称为菲涅尔现象。

8.2 Schlick

菲涅尔方程是一个相当复杂的方程式,一般用Fresnel-Schlick近似:

Fschlick(l→,h→,F0)=F0+(1−F0)(1−(l→⋅h→))5

在Mathmatica中模拟

在Unreal引擎中,使用了一个模拟运算以加快速度

Fschlick(l→,h→,F0)=F0+(1−F0)2(−5.55473(l→⋅h→)−6.98316)(l→⋅h→)

8.3 导体和绝缘体

对于大多数绝缘体(非金属),F0的范围在0.02和0.05之间,实际运算中一般取经验平均值F0=0.04,并且绝缘体的F0对不同波长的光的数值是相同的,可以视作一个灰度值。 对于导体(金属),F0的范围在0.5到1.0之间,并且对不同的波长的光的数值不同,所以在实际运算中,F0的取值一般使用如下公式获得

F0=mix(0.04,Color,Metalness)

其中Metalness表示金属度,0表示存粹的绝缘体(非金属),1表示导体(金属)

Prev
微平面理论(二)
Next
光照方程