首页 > 其他分享 >【笔记】PBR初见

【笔记】PBR初见

时间:2023-04-16 21:22:07浏览次数:48  
标签:right frac PBR cdot 笔记 初见 float3 left

尝试在unity中实现类似 标准材质 的PBR材质

 本篇纯粹作为学习笔记记录,基本都是大佬现成的思路以及直接套的公式

PBR辐射率公式想必大家都有所耳闻

\(L_{0}\left(p,w_{0}\right)=\int_{Ω}^{ }\ \left(k_{d}\cdot\frac{c}{\pi}+\frac{D\cdot G\cdot F}{4\cdot\left(w_{0}\cdot n\right)\left(wi\cdot n\right)}\right)\cdot Li\left(p,w_{i}\right)\cdot\left(w_{i}\cdot n\right)\cdot dw_{i}\)

实际上这个公式大部分都已经是定式了,前人已经把所有的所有都总结好了,我们只需要记住公式然后代入就可以了

需要理解的一点是

我们的最终结果 L0 是光线通过一个无限小的立体角 Wi(由于无限小可以当做方向向量)在某一点 P 向 W0 方向(观察方向)反射的辐射率

辐射率本是表示一个区域面积上光线总量的物理量,而当面积和立体角无限小,就可以认为是一束光线在某一点的光的通量

有时候也被称为辐射度,基本可以理解为过去理解的颜色,对统一单位有积极意义

 

下面是各个公式

\(D=\frac{α^{2}}{\pi\cdot\left(\left(n\cdot h\right)^{2}\left(α^{2}-1\right)+1\right)^{2}}\)

\(G=\frac{n\cdot l}{lerp\left(n\cdot l,1,k\right)}\cdot\frac{n\cdot v}{lerp\left(n\cdot v,1,k\right)}\)

\(F=lerp\left(\left(1-\left(n\cdot v\right)^{5}\right),1,F_{0}\right)\)

\(F_{0}=\left(1-F\right)\cdot\left(1-M\right)\)

其中 M 为金属度

在直接光照下

\(k=\frac{\left(α+1\right)^{2}}{8}\)

在简洁光照下

\(k=\frac{1}{α^{2}+1}\)

 

直接光照部分的实现大同小异

在LearnOpenGL中,D 中将 粗糙度的平方改为了四次方

漫反射部分没有除 PI,而在 高光部分 乘上了 PI,使得整体更亮了一些

 

比较复杂的是间接光照部分

对于积分的算法千奇百怪,我们这里使用 Unity 自己做的 积分 和 mipmap

 1           float mip_Level = _Gloss * (1.7 - 0.7 * _Gloss );
 2                 float mip = mip_Level * UNITY_SPECCUBE_LOD_STEPS;
 3                 float3 reflect_dir = reflect(-viewDir, bumpDir);
 4                 //漫反射部分
 5                 float3 A_diffuse = ShadeSH9(float4(bumpDir, 1)) * albedo / PI;
 6                 //return float4(A_diffuse, 1);
 7                 //高光反射部分
 8                 //unity_SpecCube0、UNITY_SAMPLE_TEXCUBE_LOD均为内置
 9                 float4 colorCubeMap = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflect_dir, mip_Level);
10                 float3 env_color = DecodeHDR(colorCubeMap, unity_SpecCube0_HDR);
11                 float2 envBRDF  = tex2D(_brdfLUT, float2(max(dot(bumpDir, viewDir), 0.0), _Gloss)).rg;
12                 float3 A_specular = KunDir * env_color * (Ftmp * envBRDF.x + float3(envBRDF.y, envBRDF.y, envBRDF.y));
13                 //最终漫反射
14                 float3 ambient = (KD * A_diffuse + A_specular) * _Ao;

间接光照的BRDF通过采样一张LUT实现,具体原理非常复杂

将图放到下面

 

PBR直接光照部分的文章非常之多非常之细,而间接光照但凡深入一点就需要手搓积分

其中LearnOpenGL感觉比较明白,代码也好理解

参考资料

猴子都能看懂的PBR - 知乎 (zhihu.com)

理论 - LearnOpenGL CN (learnopengl-cn.github.io)

标签:right,frac,PBR,cdot,笔记,初见,float3,left
From: https://www.cnblogs.com/IslandZ/p/17324012.html

相关文章

  • 4.12考试听课笔记
    2023-04-16T1seq:一.:首先注意,子集不是子区间,可不连续;序列权值与min和max有关。先进行排序,就可以找到这样的规律:   2      |4     23    |4+3*(2*1+3*1)=19     234  |19+(2*2+3*1+4*1)=63     2345|63+(2*4+3*2+4*1+5......
  • FFmpeg开发笔记(一)搭建Linux系统的开发环境
    对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库。不过考虑到刚开始仅仅调用FFmpeg的API,不会马上去改FFmpeg的源码,因此只要给系统安装编译好的FFmpeg动态库,即可着手编写......
  • 前端学习笔记——Vue3组件间数值传递
    依据个人的学习需求,对Vue官网中组件部分内容的搬运和总结,可用于参看,想详细了解Vue3这部分特性的可以直接参考官网内容:https://cn.vuejs.orgprops是一种特别的attributes,我们可以在组件上生命注册。比如:如果我们要传递给博客文章组建一个标题的话,我们则必须在该组件的props列表......
  • DAPLink源码生成Keil工程并编译成功——笔记(实践篇)
    本文介绍使用DAP源码生产Keil工程的步骤。一、前期准备工作以下1~4为步骤:1.安装Python3(https://www.python.org/downloads/),并添加至路径PATH,此处忘截图了,总之看见pip、alluser、addtoPATH之类的就勾选。(网上也有些帖子说暂时不支持Python3要用Python2.7的,本人实测Pyt......
  • 斯特林数,上升幂,下降幂学习笔记
    斯特林,上升幂,下降幂,普通幂的定义第二类斯特林数n\(n\brace0\)\(n\brace1\)\(n\brace2\)\(n\brace3\)\(n\brace4\)\(n\brace5\)\(n\brace6\)\(n\brace7\)\(n\brace8\)\(n\brace9\)0\(1\)\(0\)\(0\)\(0\)\(0\)\(0\)......
  • 学习笔记403—两样本差异的统计学比较方法-假设检验
    一:背景这几天重新复习了一下以前经典的假设检验方法。包括之前使用excel来做一些简单的统计分析。假设检验(hypothesistest)亦称显著性检验(significanttest),是统计推断的另一重要内容,其目的是比较总体参数之间有无差别。假设检验的实质是判断观察到的“差别”是由抽样误差引......
  • UBUNTU下第一次写简单驱动(笔记)
    原文:https://www.freesion.com/article/83831518068/一、环境Ubuntu14.04+vmwaretools二、步骤先写个.c文件,驱动文件一般没有printf,有自己的一套,先写一个helloword.c /* *helloworld.c * *宇文凌风 * */   ......
  • 笔记-01
    1.回顾java1.java基础----软件不要安装在中文目录下。(1)JDK环境---版本:1.8---配置环境变量:[javajavac命令只能在当前所在目录使用]可以在全局使用java和javac命令(2)写了HelloWorld(3)变量语法:数据类型变量名=值;[1]数据类型:基本数据类型和引用数据类型。......
  • 最小生成树学习笔记
    定义最小生成树是指给定一个带权连通图G,如果里面有一个子图G'中的边权和加起来最小并且使得所有的点都能两两相通。性质从上述的定义可以看出,最小生成树有以下性质:如果图G中有n个点的话,G'中的边数为n-1且G'中不含有环。最小生成树可能是一个,也可能是多个。......
  • Mathematica学习笔记002-数据导入导出
    如果不能把数据导入导出,Mathematica就只能是个大号计算器了。学会了导入导出,一方面可以把数据、图像结果保存,另一方面也可以将别的程序的中间结果导出成(txt或xls格式),然后交给Mathematica处理,让骑完成高精度计算和绘图。基本操作其实很简单Export["D:\\abc.txt",{{1,2},{3,4......