光线追踪渲染实战(四):微平面理论与迪士尼 BRDF,严格遵循物理!

2023-11-04

项目代码仓库:
GitHub:https://github.com/AKGWSB/EzRT
gitee:https://gitee.com/AKGWSB/EzRT

前言

基于物理的渲染!迪士尼原则的 BRDF 实现:

在这里插入图片描述
在这里插入图片描述


上一篇博客 中,我们利用 OpenGL 在 GPU 上实现了光线追踪,尽管获得了令人惊艳(并不)的效果,与此同时遗憾的是我们的代码仅支持漫反射这种材质,为了模拟更多的材质,我们不得不继续学习

尽管我们能够使用一些土方法,比如将随机向量和镜面反射向量,根据粗糙度做一个插值,就能简单模拟模糊镜面反射,运算速度快,并且(看起来)还有不错的效果。不过这毕竟是非常主观的 hack…

注:
该方法在 spp 上去之后会有严重的 artifact

我们希望有一种统一的规范(principle)来衡量材质。规范的意义在于,我们用不同的渲染平台,渲染器去渲染同样的物体,就会得到同样的效果,这将材质和渲染人为地分离解耦

什么是 principle?设想你去打吊针,你问医生剂量多少,你希望听到的是 xxx 毫升而不是 x 师傅矿泉水瓶装满九又四分之三

0. 前情回顾

渲染方程:

还记得上一篇文章中,我们留下的问题吗?在求解渲染方程的 f r f_r fr 项的时候,我们暴力地假定了:

f r = b a s e C o l o r π f_r = \frac{baseColor}{\pi} fr=πbaseColor

事实上,对于漫反射,这么假定能够得到不错的结果,但是如果 f r f_r fr 恒定不变,我们也只能得到这样的结果了(:

一个理想的情况是:对于不同的入射角度,出射角度,表面材质,这个 f r f_r fr 会有不同的值,我们命中了金属,就返回金属的颜色,命中了塑料,就得到塑料的颜色…

对于动态的入射出射角和材质,我们能够通过 f r f_r fr 函数来模拟不同的表面,于是今天我们的任务就是根据科学家的测量和数学家的建模,物理地地确定这个 f r f_r fr 的值

1. 微平面理论

微平面理论在真实感渲染中有着举足轻重的地位,作为像素的朝圣者,我们不得不对它三叩九拜。在接触微平面理论之前,来先入为主地看这样一张相片(图源百度图片):

仔细看反射的树木,模糊的看不到树枝的轮廓了。根据人们的经验,平面越平坦,形成的反射就越接近镜面。为什么几乎水平的地面形成的反射会如此模糊和粗糙?在探究这个问题之前,回想一下模糊形成的模糊的原因。在 近邻区域重复采样 这就是形成模糊的原因。:

那么地面形成了模糊,究其原因是反射光线没有严格按照镜面反射的方向射出,而是 分布 在了标准镜面反射方向的附近,相当于采样了周围像素:

我超,好像出大问题了… 初中物理告诉我们:光沿着直线传播,光在反射的时候严格地沿着法线反射

对于上图右侧的一条法线却出现多方向的出射光,如果 ”光沿直线传播“ 的物理定律没错的话,那么问题就出在 法线 上面!

幸运的是我们有显微镜!拿起显微镜看看物体的表面(左图引自百度图片)发现很多凹凸不平的小表面,这样的小表面形成了 多个不同的法向量

对于多个不同的法向量,根据反射定律算出来的出射方向就有很多个,多条光线的颜色平均就产生了模糊。这也就解释了为什么看似光滑的地面能够反射出模糊的图像:

这便是微平面理论的由来。对于粗糙的物体,微平面法线随意分布在宏观表面上反射的方向更加随意。而对于镜面反射的物体,其微平面法线集中在宏观表面法线的附近,其反射光线的方向接近宏观表面的镜面反射方向:

就好比用 20 x 20 的 kernel 去做 blur,效果比 3 x 3 的好,法线分布越离散,模糊程度就越大。至此,我们对微平面理论有了基本的认知

2. BRDF 介绍

BRDF,Bidirectional Reflectance Distribution Function,双向反射分布函数,通常也是渲染方程中的 f r f_r fr 项。BRDF 函数接收三个参数,分别是入射光线 w i w_i wi,命中点 p p p,和出射方向 w o w_o wo,并且返回一个能量值:

f r ( p , w i , w o ) f_r(p, w_i, w_o) fr(p,wi,wo)

这个函数描述了入射光沿着 w i w_i wi 方向入射,命中 p p p 点发生反射,能够有多少能量反射到 w o w_o wo 方向。举个例子:

BRDF 有一些性质,这使得它是科学且合理的。首先是能量守恒定律,这意味着所有反射光的能量之和必须等于入射光的能量:

对于漫反射来说,它的 BRDF 处处相等,于是简单漫反射材质的 BRDF 可以近似认为是一个常数,这也就解释了上一篇博客中,我们使用常数 b a s e C o l o r π \frac{baseColor}{ \pi} πbaseColor f r f_r fr 项的原因。事实上这是 Lambert diffuse model 的描述,是一种简单好用的近似。而 1 / π 1 / \pi 1/π 是通过对 BRDF 函数立体角在半球面 Ω + \Omega^+ Ω+ 上积分积得到的

其次,根据光路可逆, w o → w i w_o → w_i wowi w i → w o w_i → w_o wiwo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

光线追踪渲染实战(四):微平面理论与迪士尼 BRDF,严格遵循物理! 的相关文章

  • 计算机图形学入门(十三)-光线追踪(基本原理)

    本部分主要介绍了光线追踪的基本原理 简述了光线追踪的实现过程 并对实现过程中第一步 求解射线与表面的交点的过程进行了全面的分析和解答 学习视频来源 GAMES101 现代计算机图形学入门 闫令琪 哔哩哔哩 bilibilihttps www
  • Games101,作业7(模板分析)

    该博客只分析较难理解的函数和用途 以及程序运行方式 简单的函数不再赘述 首先 我们将从程序运行的流程来理解代码框架 之后再按照代码文件来分析整个框架的构造思路 程序流程 main函数进入 构造Scene类 构造场景 Scene scene
  • PBR 与 OpenGL ES 2.0 中的LOD纹理:Mipmap (关于Lod和Bias)

    MipMap 当使用Mipmap的时候可能会用到xxxLod 和 xxxBias 这几种纹理采样函数 在片段着色器中 vec4 texture2D sampler2D sampler vec2 coord vec4 textureCube
  • 线性代数基础(变换)

    本文中的图片 公式等来自 GMAES101 在此向作者表达真挚的感谢 一 为什么要引入齐次坐标 平移变换不能用一个矩阵来表示 它不是线性变换 在缩放或者旋转等变换操作后 需要单独用一个向量来表示 这样表示起来就不方便了 根据以上约定 会有以
  • OpenGL渲染结果发生了奇怪的拉伸和奇怪的彩条

    部分代码如下 Load create texture and generate mipmaps int width height unsigned char image SOIL load image 1 jpg width height
  • 12、计算机图形学——几何(网格细分与网格简化)

    一 网格细分 1 1 概念 网格细分指的是将原有模型上的网格分成更多个网格 从而将模型变得更加精细 提高渲染出来的效果 让画面更加漂亮 下图就是一个网格细分的示意 左图是细分前的效果 右图是细分后的效果 可见 细分后的面数更多 模型更加精细
  • pbr公式推导过程,很好

    渲染基础理论的介绍 1 Tags math computer graphics 基础概念 辐射度学 Radiometry 辐射度学是指测量电磁辐射 包括可见光 的一系列技术 它是和观察者无关的 而近似的光度学 photometric 是观察
  • 简单的光线追踪绘制场景

    RayTracing Time 2020 11 23 Author lwk Email 1293532247 qq com Software PyCharm CPU Razon R5 4600U 计算机图形学第二次大作业 简单的光线追踪程序
  • openGL之API学习(三十)深度缓冲区深度值为负值

    通过 glReadPixels 0 0 WINDOW WIDTH WINDOW HEIGHT GL DEPTH COMPONENT GL UNSIGNED BYTE tmpPixelsBuffer 从帧缓冲区中读取深度信息 深度值竟然是负值
  • openGL之API学习(六)如何绑定深度缓冲区到片元着色器

    本质是使用帧缓冲区glBindFramebuffer GL FRAMEBUFFER m fbo 深度缓存是帧缓冲区的一个挂载点 在OpenGL中3d管线输出的结果称为 帧缓冲对象 简称FBO FBO可以挂载颜色缓冲 在屏幕上显示 深度缓冲区
  • 合批/批量渲染 (Batch)、实例化Instancing

    可以简单的理解为 批量渲染是通过减少CPU向GPU发送渲染命令 DrawCall 的次数 以及减少GPU切换渲染状态的次数 尽量让GPU一次多做一些事情 来提升逻辑线和渲染线的整体效率 但这是建立在GPU相对空闲 而CPU把更多的时间都耗费
  • 计算机图形学入门(一)-线性代数部分知识1

    本部分主要介绍了向量的点乘与叉乘在图形学中的基本应用 介绍了图形学中常用的2D矩阵变换 例如缩放 对称 切变换 旋转 平移 逆变换 组合变换和分解变换 还有在图形学中为了简化操作而采取的添加维度的方法 主要的学习过程来自下面的视频 本文只会
  • 【openGL2021版】天空盒

    openGL2021版 天空盒 大家好 我是Lampard猿奋 欢迎来到船新的openGL基础系列的博客 今天主要实现的是天空盒 1 什么是天空盒 上周我们已经实现了FPS式的摄像机控制 键盘的 WSAD 可以控制摄像头的前后左右移动 鼠标
  • openGL之API学习(十六)glViewport

    确定要绘制的区域 如果你打算把整个屏幕渲染到一个或大或小的纹理上 你需要用新的纹理的尺寸作为参数再次调用glViewport 要在渲染到你的帧缓冲之前做好 否则只有一小部分纹理或屏幕能够绘制到纹理上 void glViewport GLin
  • Games101,Lecture 13(光线与物体求交,引入包围盒)

    光线追踪 光线追踪更多的用于离线应用 因为一帧一般需要一万个CPU小时 原理 由摄像机发出感应光线 判断与物体相交的点是否可以与 光源连线 无遮挡物 如何判断光线与物体有交点 是管线追踪中较难的部分 光线与物体求交 1 与隐式表示的曲面求交
  • 光线追踪渲染实战(五):低差异序列与重要性采样,加速收敛!

    项目代码仓库 GitHub https github com AKGWSB EzRT gitee https gitee com AKGWSB EzRT 目录 前言 1 低差异序列介绍 2 sobol 序列及其实现 2 1 生成矩阵与递推式
  • BRDF详解

    光照模型主要分为三类 测量模型 经验模型和基于物理的分析模型 在计算机图形学中介绍的光照模型为经验模型中的Phong模型 也就是本人理解的 根据点距光源的位置 入射角度等信息计算的 反射强度 包括漫反射强度 镜面反射强度 但是Phong模型
  • 【翻译】Dagre-D3 文档整理和翻译

    地址 github Dagre D3 目录 文章目录 dagre d3 设计优先级 安装 npm Bower Browser Scripts 源代码构建 如何使用Darge 聚焦渲染 例子 配置布局 生成的图像 第三部分例子 推荐阅读 da
  • openGL之API学习(六十八)core profile、compatibility profile、forward compatibility

    在OpenGL的发展历程中 总是兼顾向下兼容的特性 但是到了一定的程度之后 这些旧有的OpenGL API不再适应时代的需要 还有一些扩展并不是驱动一定要实现的扩展 这些被统一划入可选的Compatibility Profile 而由Ope
  • Game101现代计算机图形学作业1

    Game101现代计算机图形学作业1 一 作业描述 二 解决方法 一 模型变换 二 投影变换 绕任意轴旋转 三 总结 四 参考和引用 一 作业描述 给定三维下三个点 v 0 2 0 0

随机推荐

  • 域控服务器和文件服务器,windows2008 r2域控制器和文件服务器问题

    发表于 2017 5 17 17 55 来自 51CTO网页 引用 原帖由 xifalniang 于 2017 5 17 17 36 发表 可能是与文件共享相关的服务异常 具体先dcdiag检查下吧 看下出错时候的系统日志 目录服务器诊断
  • 七叔带你玩转pytest—fixture,妈妈再也不用担心学不会测试了

    前言 我们今天呢来看看pytest实现fixture有几种方式 分别该怎么进行呢 小编废话不多说了咱们直接开始吧 自动化测试框架中的 fixture 我们在编写测试用例 都会涉及到用例执行之前的环境准备工作 和用例执行之后的环境清理工作 代
  • zxing解码条形码C++

    include funset hpp include
  • ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your

    报错 ERROR 1064 42000 You have an error in your SQL syntax check the manual that corresponds to your MySQL server version
  • hosts ip 指向ip_【好玩的网络-第4期】DNS硬核科普,你是怎么上网的?DNS里都有啥?传说中的hosts文件又是啥?...

    好玩的网络 系列面向普通人的网络科普视频 我在我的哔哩哔哩账号 up主 旋律果子 更新 好玩的网络 视频版 在我的知乎 用户 曾彦 专栏更新 好玩的网络 文字版 最新消息以及预告在我的个人网站www yzeng1995 top发布 大家可以
  • 09.MyBatis整合PageHelper实现分页功能

    09 MyBatis整合PageHelper实现分页功能 MyBatis可以使用第三方的插件来对功能进行扩展 分页组手PageHelper是将分页的复杂操作进行封装 使用简单的方式即可获得分页的相关数据 开发步骤 导入通用的PageHelp
  • STM32的全系列MCU的ID号的地址及读取方法

    在STM32的全系列MCU中均有一个96位的唯一设备标识符 在ST的相关资料中 对其功能的描述有3各方面 用作序列号 例如 USB 字符串序列号或其它终端应用程序 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时
  • 全桥DCDC输出电压和变比占空比的关系

    在做各种数千瓦到数十千瓦的变换器的过程中 辅助电源总是如影随形 但是我从来没有专门去做过它们 有时候遇到这方面的问题需要解决的时候 对其基本原理竟一时懵逼了 一下图为例 列出今天的疑问 输出电压和占空比 变压器变比的关系 经过一番思考和查阅
  • vue-styled-components

    1 安装 npm install vue styled components 2 在一个组件中引入
  • LabVIEW必知

    介绍 基础知识 数学函数 矩阵数学 数据采集 介绍 传感器和信号 硬件 采集数据 操作数据采集系统需要软件 而这正是LabVIEW发挥作用的地方 LabVIEW旨在与National Instruments数据采集系统一起使用 在收集数据之
  • 微服务(Microservice)那点事

    WHAT 什么是微服务 微服务简介 这次参加JavaOne2015最大的困难就是听Microservice相关的session 无论内容多么水 只要题目带microservice 必定报不上名 可见Microservice有多火 最喜欢其中
  • VUE3 学习笔记(七)动态样式 class 实现

    目录 一 绑定 HTML class 1 绑定对象 2 绑定数组 3 在组件上使用 二 绑定内联样式 1 绑定对象 2 绑定数组 3 自动前缀 4 样式多值 数据绑定的一个常见需求场景是操纵元素的 CSS class 列表和内联样式 因为
  • php GD库做水印功能,合并图片

    1 创建一个适应大小的底层图片 2 读取需要拼接的图片 dst data file get contents dst src dst img imagecreatefromstring dst data 3 把读取的图放到指定的位置 这里需
  • Redis吊打面试官的经典面试题整理

    编程界的小学生 1 Redis为什么是key value的 为什么不是支持SQL的 这题第一眼看到有点懵逼 选择key value的原因 key value简单粗暴 使用方便 效率更佳 为什么不支持sql 因为redis的内存模型是一个ha
  • OSG中的示例程序简介

    1 example osganimate一 演示了路径动画的使用 AnimationPath AnimationPathCallback 路径动画回调可以作用在Camera CameraView MatrixTransform Positi
  • apt-get 自动补全包名

    转自 http blog csdn net seasonkky article details 6321150 现象 bash的一般命令补全正常 apt get install 的包名无法自动补全 解决 实际上 在运行这句后 就可以自动补全
  • Go(六)切片

    目录 引子 切片 切片的定义 切片的长度和容量 切片表达式 使用make 函数构造切片 切片的本质 判断切片是否为空 切片不能直接比较 切片的赋值拷贝 切片遍历 append 方法为切片添加元素 切片的扩容策略 使用copy 函数复制切片
  • onInterceptTouchEvent和onTouchEvent调用关系详解

    一 onTouch onTouch是View中OnTouchListener接口中的方法 处理View及其子类被touch是的事件处理 当然 前提是touch时间能够传递到指定的view Q1 为什么会传递不到呢 Java代码 Interf
  • 供需匹配优化优化算法【matlab】

    一 算法流程 应用背景 共享停车预约系统的构成主体 即车位供给用户 停车用户和运营管理者 并对预约系统的运营模式进行了分析 为本文所构建的模型提供了相应的理论基础 其次 在已知所有预约需求停车信息的前提下 基于介绍的定时型决策预约运营模式
  • 光线追踪渲染实战(四):微平面理论与迪士尼 BRDF,严格遵循物理!

    项目代码仓库 GitHub https github com AKGWSB EzRT gitee https gitee com AKGWSB EzRT 目录 前言 0 前情回顾 1 微平面理论 2 BRDF 介绍 3 迪士尼原则的 BRD