当前位置: 首页 > news >正文

OpenGL学习笔记(PBR)

目录

  • 微平面模型
  • 反射率方程
  • BRDF

GitHub主页:https://github.com/sdpyy1
OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL

PBR,基于物理的渲染(Physically Based Rendering)

微平面模型

所有的PBR技术都基于微平面理论。这项理论认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。根据平面粗糙程度的不同,这些细小镜面的取向排列可以相当不一致:
下图展示了ROUGH和SMOOTH的微平面
请添加图片描述
我们假设一个粗糙度(Roughness)参数,然后用统计学的方法来估计微平面的粗糙程度。我们可以基于这个粗糙程度来计算众多微平面中朝着半程向量方向的比例。微平面的朝向方向与半程向量的方向越是一致,镜面反射的效果就越是强烈越是锐利。通过使用一个介于0到1之间的粗糙度参数,我们就能概略地估算微平面的取向情况了请添加图片描述
为了遵守能量守恒定律,我们需要对漫反射光和镜面反射光做出明确的区分。当一束光线碰撞到一个表面的时候,它就会分离成一个折射部分和一个反射部分。
反射部分就是镜面光,折射部分被吸收进而转为漫反射

对于金属表面,折射光会被直接吸收而不会散开,也就是没有了漫反射,因此它们两者在PBR渲染管线中被区别处理。

float kS = calculateSpecularComponent(...); // 反射/镜面 部分
float kD = 1.0 - ks;                        // 折射/漫反射 部分

反射率方程

基于物理的渲染所坚定遵循的是一种被称为反射率方程(The Reflectance Equation)的渲染方程的特化版本。要正确地理解PBR,很重要的一点就是要首先透彻地理解反射率方程:
L 0 ( p , ω o ) = ∫ Ω f r ( p , ω i , ω o ) L r ( p , ω i ) n ⋅ ω i d ω i L_0(p, \omega_{\text{o}}) = \int_{\Omega} f_{r}(p, \omega_{\text{i}}, \omega_{\text{o}}) L_{r}(p, \omega_{\text{i}}) n \cdot \omega_{\text{i}} \, d\omega_{\text{i}} L0(p,ωo)=Ωfr(p,ωi,ωo)Lr(p,ωi)nωidωi

一些物理量,在Games101已经接触过

  • 辐射通量Φ:光源输出的能量,以瓦特为单位
  • 辐射强度:单位球面上,一个光源向每单位立体角所投射的辐射通量 I = d Φ d ω I = \frac{d\Phi}{d\omega} I=dωdΦ
  • 辐射率:一个拥有辐射强度Φ的光源在单位面积A,单位立体角ω上的辐射出的总能量. L = d 2 Φ d A d ω cos ⁡ θ L = \frac{d^2 \Phi}{dA d\omega \cos \theta} L=dAdωcosθd2Φ

这里的 c o s θ cos\theta cosθ为入射光与平面法线的夹角余弦,也就是说入射光越斜,平面接受到的光能量越弱

事实上,当涉及到辐射率时,我们通常关心的是所有投射到点p上的光线的总和,而这个和就称为辐射照度或者辐照度(Irradiance)。

再回到渲染方程
L 0 ( p , ω o ) = ∫ Ω f r ( p , ω i , ω o ) L r ( p , ω i ) n ⋅ ω i d ω i L_0(p, \omega_{\text{o}}) = \int_{\Omega} f_{r}(p, \omega_{\text{i}}, \omega_{\text{o}}) L_{r}(p, \omega_{\text{i}}) n \cdot \omega_{\text{i}} \, d\omega_{\text{i}} L0(p,ωo)=Ωfr(p,ωi,ωo)Lr(p,ωi)nωidωi

ω i \omega_{\text{i}} ωi就表示半球面的一个立体角,然后在整个半球面进行积分,所以 L o ( p , ω o ) L_o(p,\omega_o) Lo(p,ωo)就代表从 ω o \omega_o ωo方向上观察,光线投射到p点后反射出来的irradiance

BRDF

现在这个方程就剩下 f r ( p , ω i , ω o ) f_{r}(p, \omega_{\text{i}}, \omega_{\text{o}}) fr(p,ωi,ωo)未解释了。BRDF,或者说双向反射分布函数,它接受入射(光)方向ωi,出射(观察)方向ωo

BRDF基于我们之前所探讨过的微平面理论来近似的求得材质的反射与折射属性。几乎所有实时渲染管线使用的都是一种被称为Cook-Torrance BRDF模型。

Cook-Torrance BRDF兼有漫反射和镜面反射两个部分:
f r = k d f l a m b e r t + k s f c o o k − t o r r a n c e f_r = k_df_{lambert}+k_sf_{cook-torrance} fr=kdflambert+ksfcooktorrance

其中 f l a m b e r t = c / π f_{lambert} = c/\pi flambert=c/π,c表示表面颜色。除以π是为了对漫反射光进行标准化

另外镜面反射为:
请添加图片描述

字母D,F与G分别代表着一种类型的函数。三个函数分别为法线分布函数(Normal Distribution Function),菲涅尔方程(Fresnel Rquation)和几何函数(Geometry Function)

以上的每一种函数都是用来估算相应的物理参数的,而且你会发现用来实现相应物理机制的每种函数都有不止一种形式。它们有的非常真实,有的则性能高效。

  • 法线分布函数:从统计学上近似地表示了与某些(半程)向量h取向一致的微平面的比率
  • 几何函数:几何函数从统计学上近似的求得了微平面间相互遮蔽的比率,这种相互遮蔽会损耗光线的能量。
  • 菲涅尔方程:被反射的光线对比光线被折射的部分所占的比率,这个比率会随着我们观察的角度不同而不同。当光线碰撞到一个表面的时候,菲涅尔方程会根据观察角度告诉我们被反射的光线所占的百分比
    菲涅尔方程是一个相当复杂的方程式,不过幸运的是菲涅尔方程可以用Fresnel-Schlick近似法求得近似解:请添加图片描述

我觉得了解这么多足够继续看Games202课程了~

http://www.xdnf.cn/news/221743.html

相关文章:

  • LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding
  • 大模型与MCP:重塑AI应用的新篇章
  • 手动安装OpenSSL1.1.1
  • 【深度解析】YOLOE登场:CNN路线的开放世界新答卷,超越YOLO-World与Transformer
  • 去哪儿旅行 Bella Pre 分析
  • (003)Excel 在滚动的时候,保持标题栏可见
  • 论文阅读的三个步骤
  • nextcloud私有网盘系统搭建
  • 【AI提示词】第一性原理
  • Laravel基础
  • 基于PLC的图书管理识别系统设计
  • 修复典籍知识问答典籍管理界面典籍不能正确加载的问题
  • IAP远程升级入门讲解
  • 第十五章-PHP文件编程
  • Docker与Vmware网络模式的对别
  • softlockup_panic=1配置方法及区别
  • 天猫店铺代运营公司推荐与服务内容解析
  • 【进程与线程】
  • Linux权限管理进阶:文件归属、特殊权限与ACL详解
  • 力扣面试150题--删除链表的倒数第 N 个结点
  • 代发考试战报:4月份 思科认证,华为认证,考试战报分享
  • 不同类型插槽的声明方法和对应的调用方式
  • 题目:胖达的山头
  • 关于php-fpm的调优和配置
  • 2025年渗透测试面试题总结-拷打题库26(题目+回答)
  • AXPA17388: 4x45W 车用AB类四通道桥式输出音频功率放大器
  • MLOps全链路能力:模型监控、版本回滚与持续训练
  • 欧拉计划 Project Euler60(素数对集合)题解
  • LeetCode 2302 统计得分小于K的子数组数目(滑动窗口)
  • Mysql存储引擎、锁机制