【Unity Shader入门精要 第6章】基础光照(一)
1. 什么是光照模型
光照原理
在真实世界中,我们能够看到物体,是由于眼睛接收到了来自观察目标的光。这里面包括两种情况:一部分是观察目标本身发出的光(自发光)直接进入我们的眼睛,另一部分是其他物体(光源)发出的光与观察目标进行交互后最终进入我们的眼睛。不管是哪种情况,我们都可以统称为出射光。
通常,我们认为物体的自发光是均匀的,即在所有观察方向上都存在且密度、颜色相同。自发光的颜色显然跟观察目标自身的材质有关。
而其他光源的光(入射光)照射到某个物体上与物体发生交互时:
- 一部分被物体表面直接反射,按照一个严格的反射路线传播,这部分就形成了镜面反射
- 一部分进入物体内部,形成折射或透射,这部分光线也会遵循对应的物理规律,按照一定的路线传播
- 还有一部分被物体表面细小的凹凸反射,或者进入物体内部与物体内部的粒子经过多次交互后最终又从表面发散出来,这部分光线没有特定的传播路径,也可以认为是均匀的,也就是漫反射
在这中间由于物体可能会吸收部分特定波长的入射光,从而导致出射光的颜色和密度发生变化,因此出射光的颜色和密度往往也会受到物体材质的影响。
所有这些出射光本身的颜色以及进入到我们眼睛的量共同决定了我们最终看到的物体的样子。
光照模型就是以摄像机代替眼睛,计算其所能接收到的出射光的数学模拟方式。
显然,光照模型是一个涉及到 “光源”(入射光的颜色、角度等)、“观察目标”(出射光的颜色、角度)、“观察者”(观察方向) 三方的数学模型。 基于不同类型出射光自身的特性,其计算可能会与这三者中的一个或多个有关。
标准光照模型
标准光照模型理论上只关心直接光照,即光线从光源射出后,只经过与物体的一次交互直接进入摄像机得到的颜色。间接光照的部分通过环境光进行统一概括。
在标准光照模型中,决定观察目标最终颜色的出射光包括四部分:
- 环境光
- 自发光
- 漫反射
- 高光反射
2. 环境光
- 用于概括表示光线在环境间多次反射后进入摄像机的颜色
- 是一个全局指定的颜色,与上文三者均无关
- Cambient = Gambient
- 其中 Gambient 为全局指定的环境光颜色
3. 自发光
- 由观察目标发出,且是均匀的,因此与光源和观察者均无关
- Cemissive = Memissive
- 其中 Memissive 为材质自身的自发光颜色
- 自发光只是表示观察目标本身材质带来的颜色影响,并不是作为真正的光源使用,因此不会照亮其他物体
4. 漫反射
- 由观察目标反射入射光而来,且出射光均匀,因此与光源和观察目标有关,与观察者无关
- 符合兰伯特定律:反射光线的强度与表面法线和光源方向之间的夹角的余弦值成正比
- 两种计算漫反射的模型:
- 兰伯特模型
- Cdiffuse = Clight * Mdiffuse * Max(0, n·l)
- 其中Clight为入射光的颜色,Mdiffuse为材质自身漫反射颜色,n为法线方向,l为光源方向(点到光源)
- 该模型严格按照兰伯特定律计算,当光源在点背面时,认为不应该被光源照亮,此时l和n夹角超过90°,通过 Max(0, n·l) 对这种情况进行直接截取
- 该模型会导致背向光源的面都被截取为0,因此背光面完全为黑色,不会展现任何细节
- 半兰伯特模型
- Cdiffuse = Clight * Mdiffuse * (n·l * 0.5 + 0.5)
- 通过缩放加平移的方式,将 n·l 的结果映射到了[0, 1]的区间内,从而使背光面也能有一定的细节展现,而非完全是黑色
- 该模型没有物理依据,只是从数学角度出发,对兰伯特模型的渲染效果进行优化
- 兰伯特模型
5. 高光反射
-
由观察目标反射入射光而来,且反射光线有特定传播路径,可以被摄像机接收到的出射光数量受出射光和观察方向的夹角影响,因此,高光反射与光源、观察目标、观察者三方均有关
-
对于高光反射的计算模型都是经验模型,即均为通过数学方式对高光反射的效果进行模拟,并不是真实的物理模型
-
两种计算高光反射的模型:
-
Phong 模型
- Cspecular = Clight * Mspecular * Max(0, v · r)Mgloss
- r = 2(l ·n)- l
- 其中Clight为入射光的颜色,Mspecular为材质自身的高光反射颜色,v为观察方向(点到摄像机)r为反射光线的方向,Mgloss为观察目标的光泽度,用于控制高光亮斑的大小,其值越大,亮斑越小
- 该模型遵循高光反射的原理,通过反射方向与观察方向的点乘(cosθ)来模拟二者夹角对观察高光反射的效果影响
-
Blinn - Phong 模型
- Cspecular = Clight * Mspecular * Max(0, n · h)Mgloss
- h = (l + v) / | l + v |
- 其中 h 为光源方向与观察方向的合成向量(归一化)
- 该模型将光源方向与观察方向合成一个参考向量,通过这个参考向量与照射点法线之间的夹角来模拟对观察高光反射的效果影响
-
-
由于Blinn - Phong模型先求h向量再与n点乘,当光源、观察目标、观察者三方距离远到一定程度时,l 和 v 几乎不变,可以被看做是定值,此时h也为定值,因而可以跳过求h的过程,此时相比Blinn - Phong模型必须要先与n点乘求反射方向之后再与观察方向v点乘,Blinn - Phong模型计算速度更快。
-
而当距离不够远时,l 和 v不可看作定值,此时从速度和效果上,Phong模型都要更好一些
6. 逐顶点光照和逐像素光照
- 高洛德着色
- 逐顶点光照
- 在顶点着色器中对每个顶点进行光照计算
- 三角面内部的光照颜色通过对顶点进行线性插值获得
- 其优点是相比逐像素光照,计算速度更快
- 缺点是由于三角面内部都是通过对顶点光照结果插值获得的,因此三角面内部的颜色一定比顶点处更暗,某些情况下容易出现棱角,并且因为都是线性插值,无法很好地表现一些非线性的光照效果
- Phong着色
- 逐像素光照
- 在片元着色器中按照每个像素的法线等信息进行光照计算
- 其优点是针对每个像素自身的信息进行光照计算且可以通过法线贴图等方式提供更细致的控制信息,因此光照结果更好
- 缺点是相比只计算顶点,逐像素光照的计算量更大,速度更慢
7. 标准光照模型的问题
- 难以模拟菲涅尔反射等特殊物理现象
- 各向同性
相关文章:

【Unity Shader入门精要 第6章】基础光照(一)
1. 什么是光照模型 光照原理 在真实世界中,我们能够看到物体,是由于眼睛接收到了来自观察目标的光。这里面包括两种情况:一部分是观察目标本身发出的光(自发光)直接进入我们的眼睛,另一部分是其他物体&am…...

JavaEE概述 + Maven
文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE: Java SE:指Java标准版,适用于各行各业,主要是Java…...
python把png转成jpg
在Python中,你可以使用PIL(Python Imaging Library,也称为Pillow)库来读取PNG图片并将其转换为JPG格式。下面是一个简单的示例代码: from PIL import Image# 打开PNG图片 png_image Image.open(input.png)# 保存为JP…...
信息系统架构基本概念及发展_2.信息系统架构的定义
1.几种架构的定义 信息系统架构仍在不断发展中,还没有形成一个公认的定义,这里举出几个定义。 定义1:软件或计算机系统的信息系统架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见…...

ctfshow SSRF 351-358
做题前,需要先学习关于ssrf漏洞的相关知识 小注意: 当使用 file_get_contents() 函数访问远程 URL 时,它会尝试获取该 URL 指向的资源的内容,并将内容以字符串的形式返回。 如果 b.php 文件是一个 PHP 文件,它包含的内容取决于该 PHP 文件…...
优化学习方法,事半功倍
学习,是人一生中必不可少的过程。在学习的道路上,我们会遇到各种各样的挑战和困难,但只要我们能够发现并优化适合自己的学习方法,就能事半功倍,取得更好的成绩。 首先,要充分了解自己的学习方式和习惯。每个…...
Spring STOMP-开启STOMP
通过Spring框架的spring-messaging和spring-websocket模块,提供了对WebSocket上STOMP的支持。一但你添加了这些依赖项,你就可以像下面这个示例一样,通过WebSocket公开一个STOMP端点: import org.springframework.web.socket.conf…...

Python 开发 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)
什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库,使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”(模型-模板-视图)的设计模式,将应用程序的不同组件分离开来&#x…...

《Python编程从入门到实践》day25
# 昨日知识点回顾 如何创建多行外星人 碰撞结束游戏 创建game_stats.py跟踪统计信息 # 今日知识点学习 第14章 记分 14.1 添加Play按钮 14.1.1 创建Button类 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按钮…...

Unity 性能优化之光照优化(七)
提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、测试目的一、实时光源是什么?二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…...

C语言 | Leetcode C语言题解之第84题柱状图中最大的矩形
题目: 题解: int largestRectangleArea(int* heights, int heightsSize) {int st[heightsSize];int p[2];p[0]-1,p[1]heightsSize;int size0,result0;st[size]0;for(int i1;i<heightsSize;i){ while(size!0&&heights[i]<heights[st[size-1…...

AI办公自动化-用kimi批量重命名Word文档
文件夹里面有很多个word文档,标题里面都含有零代码编程,现在想将其替换为AI办公自动化。 在kimichat中输入提示词: 你是一个Python编程专家,要完成一个编写Python脚本的任务,具体步骤如下: 打开文件夹&am…...
Golang 并发 Mutex 互斥锁的使用
Golang 并发 Mutex 互斥锁的使用 1. 初始化 func TestMutex(t *testing.T) {mu01 : sync.Mutex{}var mu02 sync.Mutex }两种方式都ok 2. Mutex使用 计数器统计,多个协程同时对同一个变量进行 代码示例 var mu sync.Mutex var counter intfunc TestMutexAdd(t…...

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业
20232906 2023-2024-2 《网络与系统攻防技术》第九次作业 1.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段,getShell&am…...
常见的十二种软件架构
常用的软件架构有多种,以下是一些主要的软件架构风格: 单体架构(Monolithic Architecture): 描述:所有功能都集中在一个应用或系统中,易于开发和部署,但随着系统增长,可能…...

数据库出现死锁的解决方法参考
死锁引起的原因一般是多个用户并发访问数据库导致的问题,或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…...
HCIP-Datacom-ARST自选题库_01_防火墙【6道题】
一、单选题 1.在防火墙域间安全策略中,请问以下哪一项的数据流不是Outbound方向的? 从Trust区域到DMZ区域的数据流 从Trust区域到Untrust区域的数据流 从Trust区域到Local区域的数据流 从DMZ区域到Untrust区域的数据流 2.如果防火墙域间没有配置安全策路&…...

力扣/leetcode383.比特位记数
题目描述 给你一个整数 n ,对于 0 < i < n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n 1 的数组 ans 作为答案。 示例 代码思路 第一种方法 最简单的方法就是,遍历然后使用python自带的bin()方法直接…...

react18【系列实用教程】useEffect —— 副作用操作 (2024最新版)
什么是副作用操作? useEffect 用于编写由渲染本身引起的对接组件外部的操作(官方称呼为:副作用操作) 以下情况会触发页面渲染 初次加载页面(组的挂载)响应式变量发生变化,触发页面根据新值重新…...

Excel 分组汇总后删除明细
有 Excel 数据如下所示: IDCriteria1Criteria2Criteria3Criteria4101210271239312381236123171826182918239182120182147 需要按 ID 分组汇总其余列,结果如下: IDCriteria1Criteria2Criteria3Criteria410121027123932561826939267 解法及简…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...