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

GAMES202-高质量实时渲染(Real-Time Physically-based Materials)

目录

  • Micorfacet BRDF
    • F项:Fresnel term
    • G项:shadowing-masking term(geometry term)
    • D项:Normal Distribution Function(NDF)
      • Beckmann NDF
      • GGX NDF
    • Multiple Bounces
    • LTC(Shading Microfacet Models using Linearly Transformed Cosines)
  • Disney’s Principled BRDF
  • Non-Photorealistic Rendering(NPR)
    • Outline Rendering 描边
    • Color blocks 色块效果
    • Strokes Surface Stylization 素描效果

GitHub主页:https://github.com/sdpyy1
作业实现:https://github.com/sdpyy1/CppLearn/tree/main/games202

Micorfacet BRDF

在这里插入图片描述

F项:Fresnel term

Fresnel项(Fresnel term)用于描述光在界面上反射的强度随入射角变化的现象。在这里插入图片描述
对于绝缘体材质
在这里插入图片描述
对于导电材质
在这里插入图片描述
Snell’s Law(斯涅尔定律)描述的是光在两种介质交界面上传播时的折射行为
在这里插入图片描述
如果分为RGB三个通道,三个通道有自己的折射率。
Rs:垂直偏振(s-polarized)反射率
Rp:平行偏振(p-polarized)反射率
因为自然光通常是非偏振光(即含有相等的 s 和 p 偏振分量),所以实际使用时我们取两者的平均来得到总反射率:两者通过平均得到Fresnel平均反射率。
R0是垂直入射下的反射率,可以通过两种介质的折射率获得,他是一个三通道。进一步可以用Schlick’s Approximation来近似出θ角度下的反射率
在这里插入图片描述

G项:shadowing-masking term(geometry term)

为了解决微表面的自遮挡问题
下图左边表示光线被遮挡(shadowing),右图是视线被遮挡(masking)
在这里插入图片描述
如果没有G项,当视角和法线接近90°时,BRDF分母会接近0,所以BRDF会变得巨大,导致球体一圈变成白色
在这里插入图片描述
常用的G项为The Smith shadowing-masking term
把shadowing和masking两种情况分开考虑
在这里插入图片描述
他是基于NDF的值来考虑G项的值的
在这里插入图片描述

D项:Normal Distribution Function(NDF)

微表面上看法线方向并不是统一的
当法线分布更多在半程向量时,反射光强度更大

glossy和diffuse的表面法线分布情况,glossy的表面分布比较集中
在这里插入图片描述
有不同的模型来描述法线分布

  • Benckmann、GGX
    在这里插入图片描述

Beckmann NDF

在这里插入图片描述
两个系数来控制分布。阿尔法控制表面的粗糙程度。sita控制半程向量和法向量的夹角
在这里插入图片描述
圆心是着色点,红色是微观法线。黑线是宏观着色点法线。他们的夹角就是sita,把红线延长到上面的一条线上。用tansita来定义分布
在这里插入图片描述
所以说Beckmann NDF是定义在tanθ上的高斯分布

GGX NDF

它的尾巴比较长,如下图橙色尾巴很长。而beckmannNDF在90°时已经衰减为非常接近0。如果把高出定义为高光,那backmannNDF高光周围会迅速衰减。而GGX会缓慢衰减,形成光晕的效果
在这里插入图片描述
下图可以看出backmann高光周围比较尖锐。GGX比较平滑
在这里插入图片描述
所以说GGX的长尾可以带来自然过渡的效果。

GGX的拓展
定义参数gamma,调整尾巴衰减速度
在这里插入图片描述

Multiple Bounces

现在已经学习了BRDF的FGD三项的构成。但是这样渲染出来还有问题。随着roughness的增加,模型逐渐变暗了。下面一行是在做能量损失实验,说明roughness越大,能量损失越多了
在这里插入图片描述
这种能量损失体现在,越粗糙的表面法线分布更容易被挡住
在这里插入图片描述
所以要考虑多次bounces,有相关的论文,但是对于实时渲染太慢了
在这里插入图片描述
所以现在有了基于经验补全的方式,kulla-Conty Approximation
首先根据渲染方程,假设输入的L=1,计算输出的能量是多少
在这里插入图片描述
所以1-E(u0)就是损失的能量(E与观察方向有关系,所以不同的视角下损失能量是不一样的),最后补上这部分能量。
具体怎么算出来就不看了。最终损失能量依赖于观察方向和粗糙度两个变量。所以直接预计算打表即可。
在这里插入图片描述
补充前后对比
在这里插入图片描述

LTC(Shading Microfacet Models using Linearly Transformed Cosines)

LTC 最初是由 Tobias Ritschel 等人在论文《LTC - A Fast and Efficient Approximation of Fresnel Terms and Distribution of Normal Vectors for Real-Time Rendering》提出的,它被设计为一种方法来 近似反射分布函数(BRDF)
Fresnel项 和 法线分布函数(例如 GGX)是微面模型的关键组成部分,这些函数非常复杂,计算成本较高。LTC 使用线性时间编码(Linear Time Coding)来近似这些复杂的分布,使得实时渲染时可以快速计算这些项。
综上LTC是一种对BRDF项的预计算

首先,它是有限制的。主要是在GGX的法线分布下、没有阴影、多边形光源
请添加图片描述
主要思想是任何BRDF lobe 都可以通过一个变换转化为一个余弦函数
请添加图片描述
请添加图片描述
实际实现比较复杂,课程没提到

Disney’s Principled BRDF

首先介绍了为什么有了微表面BRDF还需要Disney的BRDF
请添加图片描述
它被称为principled的BRDF,可以通过调整参数来达到想要的效果,所以他是艺术家友好的
请添加图片描述
介绍一下里边的名词

  1. subsurface(次表面反射):光线进入表面后并不会直接反射回去,而是穿透表面并在内部多次散射,最终可能以不同的方向从表面射出。
  2. metallic(金属性)
  3. specular(镜面)
  4. specularTint(镜面颜色):specularTint 是一个与 镜面反射(Specular Reflection)相关的参数,用来控制反射光的颜色如何与 材质本身的颜色混合。也就是说镜面反射光不是单纯的白色,而且受表面材质颜色的影响
  5. anisotropic(各向异性):述材料或表面在不同方向上具有不同物理特性的术语
  6. sheen(沿着球的表面有绒毛雾化效果)
  7. clearcoat(添加一层镀膜)

Non-Photorealistic Rendering(NPR)

Outline Rendering 描边

先来看看有哪些Outline,B表示自己的边界,S表示两个面交界处形成的边界,C是折痕,M是材质边界
请添加图片描述
知道了边界,下来就需要描边,可以通过Shading或者图像处理来完成。首先来介绍Shading方法,哪些像素点是S边上呢,根据观察,就是法线与观察方向=之间夹角接近垂直的像素点。可以设置夹角的阈值,来改变边的粗细
请添加图片描述
另外就是外扩法,之前learnOpenGL里有
请添加图片描述
另外看一下从图像上来处理
请添加图片描述

Color blocks 色块效果

请添加图片描述
直接把渲染结果量化,就是连续值变成离散
请添加图片描述

Strokes Surface Stylization 素描效果

请添加图片描述
请添加图片描述

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

相关文章:

  • C++课设:通讯录管理系统(vector、map协作实现)
  • 在VSCode中开发一个uni-app项目
  • 企业级网络安全攻防全景指南:从渗透测试到防御体系建设
  • 基于深度学习(Unet和SwinUnet)的医学图像分割系统设计与实现:超声心脏分割
  • 6. MySQL基本查询
  • Elasticsearch集群状态为RED且存在未分配分片问题排查诊断
  • GitHub 趋势日报 (2025年06月03日)
  • 小白的进阶之路系列之十四----人工智能从初步到精通pytorch综合运用的讲解第七部分
  • Delphi中实现批量插入数据
  • 5分钟了解,Mysql事务事务隔离级别
  • tensorflow image_dataset_from_directory 训练数据集构建
  • 使用 Python 的 psutil 库进行系统资源监控
  • Webpack搭建本地服务器
  • Unity3D 逻辑代码性能优化策略
  • Linux kill 暂停命令
  • 跟着deepseek浅学分布式事务(2) - 两阶段提交(2PC)
  • 人工智能:网络安全的“智能守护者”
  • 录制mp4
  • Kali Linux 安全工具解析
  • Ros(控制机器人运动)
  • .NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
  • JVMTI 在安卓逆向工程中的应用
  • 【Oracle】存储过程
  • 纹理压缩格式优化
  • OpenCV 自带颜色表实现各种滤镜
  • 【Netty源码分析总结】
  • 使用 Unstructured 开源库快速入门指南
  • 机器学习:聚类算法
  • Python爬虫:trafilatura 的详细使用(快速提取正文和评论以及结构,转换为 TXT、CSV 和 XML)
  • Day44打卡 @浙大疏锦行