我的博客和笔记我的博客和笔记
首页
文章
  • 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)
        • 微平面理论(一)
        • 微平面理论(二)
          • 6. 法线分布函数详解
            • 6.1 归一化约束
            • 6.2 Phong
            • 6.3 Beckmann
            • 6.4 Trowbridge-Reitz(GGX)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

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

      • JavaScript

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

微平面理论(二)


6. 法线分布函数详解

6.1 归一化约束

所有的法线分布函数都应该符合以下约束

(v→⋅n→)=∫ΩD(m)(v→⋅m→)dωm

可以理解为,这些为平面在某个指定方向上的投影面积,等于整体宏平面的投影面积

当v=n时,有

1=∫ΩD(m→)(n→⋅m→)dωm

6.2 Phong

Phong模型认为,反射强度正比于(n→⋅m→)α,其中α表示材质的“光滑程度”,当α=0,材质是绝对的漫反射材质,当α→∞,材质成为绝对光滑的镜面,设

Dphong(m→)=Rp(n→⋅m→)α

由上面法线分布函数的归一性可知

1=∫ΩRp(n→⋅m→)α+1dωm

由于dωm=sin⁡(θ)dϕdθ

1=∫02π∫0π/2Rpcosα+1⁡(θ)sin⁡(θ)dθdϕ=2π2+αRp

可以得到最终D函数为

Dphong(m→)=2+α2π(n→⋅m→)α

一般引擎用粗糙度(取值范围[0,1])表示材质的光滑程度,Phong模型中的α常用如下公式计算

αphong=2roughness4−2

用Mathmatica绘制函数图

6.3 Beckmann

Beckmann的法线分布函数为

Dbeckmann(m→)=Rbeckmann1α2(n→⋅m→)4e−(1−(n→⋅m→)2(n→⋅m→)2α2)

经过积分计算Rbeckmann=1/π,所以

Dbeckmann(m→)=1πα2(n→⋅m→)4e−(1−(n→⋅m→)2(n→⋅m→)2α2)

Beckmann法线分布函数中,α同样代表了材质的粗糙度,趋向于0时表示绝对光滑,取值却大约粗糙,但当取值超过1时,材质会变得“超级粗糙”(诡异),α用如下公式获取

αbeckmann=roughness2

当α取值在0.5以下时,Beckmann模型和Phong模型的结果非常相似,这两个参数可以有如下对应关系

αphong=2αbeckmann2−2

6.4 Trowbridge-Reitz(GGX)

这个模型又被称为GGX模型,是UnrealEngine采用的法线分布函数

DGGX(m→)=RGGX1((n→⋅m→)2(α2−1)+1)2

经过积分RGGX=α2/π,所以

DGGX(m→)=α2π((n→⋅m→)2(α2−1)+1)2

在Mathmatica中的模拟

可以看出,当α趋向于0,表示材质越光滑,当α=1时,GGX称为一条直线,也就是纯粹的漫反射材质,当α>1,GGX模型的表现类似于Beckmann,表现出“超级粗糙”特性。 和Phong模型比较,可以看出在粗糙度小于0.4时,ggx和phong模型比较类似,当粗糙度大于0.4时,ggx的表现更“平顺”一些,高光中心更集中,但长尾区域更长。

在Unreal实现中,定义了α=roughness2, roughness是用户输入的材质粗糙度,范围在[0,1]之间

Prev
微平面理论(一)
Next
微平面理论(三)