Unity中Shader双向反射分布函数BRDF

文章目录

  • 前言
  • 一、渲染方程
  • 二、什么是BxDF
    • 1、BSSRDF
    • 2、BRDF
    • 3、BTDF
    • 4、BSDF
  • 三、迪士尼原则的BRDF
  • 四、迪士尼原则的BRDF的参数
  • 五、在Unity中看一下默认Shader的这些参数
  • 六、在这里记录一下使用 Blender 和 SubstancePainter 的流程
    • 1、在Blender中导出模型为 .obj 格式
    • 2、在SubstancePainter中导入(在SP中导入是使用新建)


前言

Unity中Shader双向反射分布函数BRDF。在上一篇文章中,我们知道了PBR的核心是PBS。而PBS的核心就是 双向反射发布函数(BRDF)


一、渲染方程

  • 渲染方程描述了光能在场景中的流动,根据光的物理学原理,渲染方程可以完美的模拟出符合物理光学的结果。

该公式是根据现实物理推到得出的,实际渲染不用这个,而是在这个的基础上简化
在这里插入图片描述

  • L0是当前点的出射光亮度(可以理解为输出颜色)
  • Le是当前点的自发光亮度
  • ƒr是当前点的入射方向到出射方向光的反射比例,为BxDF
  • Li是当前点的入射光亮度
  • (ωi*n)是入射角带来的入射光衰减
  • ʃΩ…dωi是入射方向半球的积分,可以理解为无穷小的累加和

我们在渲染时,主要考虑的是 ƒr ,BxDF


二、什么是BxDF

在这里插入图片描述

1、BSSRDF

  • Bidirectional Surface Scattering Reflectance Distribution Function(双向表面散射反射分布函数)
    双向:这个函数需要已知 入射光向量 和 视线向量
    表面散射反射:这个函数几乎完全模拟出了物理光照物体的效果

2、BRDF

  • Bidirectional Reflectance Distribution Function(双向反射分布函数)

双向:这个函数需要已知 入射光向量 和 视线向量
反射:这个函数只模拟了光照到物体表面高光反射的效果

3、BTDF

  • Bidirectional Transmittance Distribution Function(双向透射分布函数)

双向:这个函数需要已知 入射光向量 和 视线向量
透射:这个函数只模拟了光照到物体表面穿透 高光透射 的效果

4、BSDF

  • Bidirectional Scattering Distribution Function(双向散射分布函数)

双向:这个函数需要已知 入射光向量 和 视线向量
散射:这个函数同时模拟了 高光反射 和 高光透射 的效果

  • BSDF = BRDF + BTDF

我们在Unity中,主要使用的时BRDF(双向反射分布函数),即只考虑物体表面的高光反射效果。


三、迪士尼原则的BRDF

BRDF有很多公式。但是,比较通用普及的是迪士尼原则的BRDF

迪士尼动画工作室在 SIGGRAPH2012上进行了著名的 Physically based shading at Disney 演讲,正式提出了 迪士尼原则的BRDF,由于其 高度的通用性 在电影界和游戏界都引起了不小的轰动。

迪士尼原则的BRDF的核心理念:

  • 使用直观的参数,而不是晦涩的物理类参数
  • 参数尽可能的少
  • 参数在其合理范围内应该为 0 - 1
  • 允许参数在有意义的情况下超出正常的范围
  • 所有参数组应尽可能的健壮与合理

四、迪士尼原则的BRDF的参数

在这里插入图片描述

  • BaseColor(固有色):表面的颜色,通常由纹理提供

  • Subsurface(次表面):使用次表面近似的控制漫反射形状

  • Metallic(金属度):0 = 非金属,1 = 金属,这是两种不同类型之间的线性混合

  • Specular(镜面反射强度):镜面反射的强度

  • SpecularTint(镜面反射颜色):对美术控制的让步,用于对BaseColor的入镜镜面反射进行颜色控制

  • Roughness(粗糙度):表面粗糙度,控制漫反射和镜面反射

  • Anisotropic(各向异性强度):用于控制镜面反射高光的纵横比,0 = 各向同性,1 = 各向异性(正常的物体一般是各向同性的)

  • Sheen(光泽度):一种额外的掠射分量。主要用于布料

  • SheenTint(光泽颜色):对Sheen的颜色控制

  • ClearCoat(清漆强度):特殊用途的第二个镜面波瓣

  • ClearCoatGloss(清漆光泽度):控制透明图层光泽度

标红的参数是Unity中用到的


五、在Unity中看一下默认Shader的这些参数

首先,我们需要把颜色空间修改为线性的
(Edit->Project Setting->Player->Other Settings)
在这里插入图片描述

然后,我们在Unity中导入一个模型用于测试PBR的主要参数:

我们可以使用SubstancePainter软件来输出这下图中需要的纹理

在这里插入图片描述


六、在这里记录一下使用 Blender 和 SubstancePainter 的流程

1、在Blender中导出模型为 .obj 格式

在这里插入图片描述

2、在SubstancePainter中导入(在SP中导入是使用新建)

在这里插入图片描述
SubstancePainter中移动快捷键:

旋转视图:ALT+鼠标左键;移动视图:ALT+鼠标中键

因为Unity中对于PBR的不同单通道效果使用多个纹理,比较浪费系统资源。
所以,我们可以在自己的Shader中改写,对一张贴图的RGB通道来分别采样使用

这是在SP中,自定义的纹理输出格式

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/178109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谈一谈什么是接口测试?怎样做接口测试?

扫盲内容: 1.什么是接口? 2.接口都有哪些类型? 3.接口的本质是什么? 4.什么是接口测试? 5.问什么要做接口测试? 6.怎样做接口测试? 7.接口测测试点是什么? 8.接口测试都要掌…

python批量修改文件夹下的后缀名

python批量修改文件夹下的后缀名 (所有的.txt结尾的文件,替换成.py结尾) 1、需要将某个文件夹下所有的.txt结尾的文件,替换成.py结尾 2、Python代码: import os# 指定需要更改文件的目录 dir_path D:/study/py/4#…

蓝桥杯物联网_STM32L071_2_继电器控制

CubeMX配置: Function.c及Function.h: #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

如何使用YOLOv8代码框架中的RT-DETR

1. RT-DETR RT-DETR是由由此,百度推出了——RT-DETR (Real-Time DEtection TRansformer) ,一种基于 DETR 架构的实时端到端检测器,其在速度和精度上取得了 SOTA 性能。 RT-DETR开源的代码在百度自己的飞桨paddlepaddle上,因此非…

Oauth2认证及Spring Security Oauth2授权码模式

Oauth2认证 Oauth2简介 简介 第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使…

复旦、人大等发布大五人格+MBTI测试 角色扮演AI特质还原率达82.8%

近期,由复旦大学和中国人民大学合作的Chat凉宫春日团队发布了一项关于AI角色扮演的研究。该研究强调了良好的人设还原度对于评价AI角色扮演的重要性,特质还原率高达82.8%。研究使用了大五人格的NEO-FFI问卷和MBTI的16Personalities测试,并通过…

深度学习之基于YoloV5车辆和行人目标检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介YOLOv5 简介YOLOv5 特点 车辆和行人目标检测系统 二、功能三、系统四. 总结 一项目简介 # 深度学习之基于 YOLOv5 车辆和行人目标检测系统介绍 深度学习在…

电大搜题——让学习变得轻松高效

作为一名现代学者,您一定时刻关注着教育领域的进展和创新。今天,我将向大家介绍一个名为“电大搜题”的神奇工具,它将为您的学习之路带来一场完美的革命。 在快节奏的现代社会中,学习已经成为每个人追求成功的必经之路。然而&…

redis五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存,并且所有的key都是字符串,所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是:String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型,v…

解决 Python整数值的 header 问题

在使用Python的requests库进行HTTP请求时,自requests 2.11版本以后,出现了无法处理包含整数值的header的问题。这导致了所有使用requests库的请求都出现错误。 问题的发起者遇到了一个麻烦,就是在使用Python的requests库进行HTTP请求时&#…

C++:AVL树(平衡二叉树)

引言: AVL树是一种特殊的二叉搜索树,二叉搜索树虽然可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Ade…

基于STM32的烟雾浓度检测报警仿真设计(仿真+程序+讲解视频)

这里写目录标题 📑1.主要功能📑2.仿真📑3. 程序📑4. 资料清单&下载链接📑[资料下载链接](https://docs.qq.com/doc/DS0VHTmxmUHBtVGVP) 基于STM32的烟雾浓度检测报警仿真设计(仿真程序讲解) 仿真图prot…

iEnglish全国ETP大赛:教育游戏助力英语习得

“seesaw,abacus,sword,feather,frog,lion,mouse……”11月18日,经过3局的激烈较量,“以过客之名队”的胡玲、黄长翔、林家慷率先晋级“玩转英语,用iEnglish”第三届全国ETP大赛的16强,在过去的周末中,还有TIK徘徊者队、不负昭华队、温柔杀戮者队先后晋级。据悉,根据活动规则,在…

杭电oj 2064 汉诺塔III C语言

#include <stdio.h>void main() {int n, i;long long sum[35] { 2,8,26 };for (i 3; i < 35; i)sum[i] 3 * sum[i - 1] 2;while (~scanf_s("%d", &n))printf("%lld\n", sum[n - 1]); }

CentOS 7 使用Fmt库

安装 fmt Git下载地址&#xff1a;https://github.com/fmtlib/fmt 步骤1&#xff1a;首先&#xff0c;你需要下载fmt的源代码。你可以从https://github.com/fmtlib/fmt或者源代码官方网站下载。并上传至/usr/local/source_code/ ​ 步骤2&#xff1a;下载完成后&#xff…

分布式锁3: zk实现分布式锁

一 zk 实现分布式锁 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 2..znode节点类型&#xff1a; 永久节点&#xff1a;create /pa…

Go 语言函数、参数和返回值详解

函数是一组语句&#xff0c;可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。 创建函数 要创建&#xff08;通常称为声明&#xff09;一个函数&#xff0c;请执行以下操作&#xff1a; 使用 func 关键字。指定函数的名称&#xff0c;后跟括…

猫不长肉怎么办?增肥效果好、让猫咪迅速圆润起来的猫罐头分享!

秋冬来临&#xff0c;北方的猫咪有暖气还好过一些&#xff0c;南方的猫咪只能依靠自己的抵抗力来过冬。如果不囤点脂肪&#xff0c;怕冷的小猫咪要怎么过冬啊&#xff1f;有些猫咪无论怎么吃也吃不胖&#xff0c;真的让铲屎官很烦恼。想起我新手养猫的那段日子为了给我家猫咪增…

.Net6使用WebSocket与前端进行通信

1. 创建类WebSocketTest&#xff1a; using System.Net.WebSockets; using System.Text;namespace WebSocket.Demo {public class WebSocketTest{//当前请求实例System.Net.WebSockets.WebSocket socket null;public async Task DoWork(HttpContext ctx){socket await ctx.We…

Gradle常用命令与参数依赖管理和版本决议

一、Gradle 常用命令与参数 本课程全程基于 Gradle8.0 环境 1、Gradle 命令 介绍 gradle 命令之前我们先来了解下 gradle 命令怎么在项目中执行。 1.1、gradlew gradlew 即 Gradle Wrapper&#xff0c;在学习小组的第一课时已经介绍过了这里就不多赘述。提一下执行命令&am…