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

【Unity Shader入门精要 第6章】基础光照(一)

1. 什么是光照模型

光照原理

在真实世界中,我们能够看到物体,是由于眼睛接收到了来自观察目标的光。这里面包括两种情况:一部分是观察目标本身发出的光(自发光)直接进入我们的眼睛,另一部分是其他物体(光源)发出的光与观察目标进行交互后最终进入我们的眼睛。不管是哪种情况,我们都可以统称为出射光。

通常,我们认为物体的自发光是均匀的,即在所有观察方向上都存在且密度、颜色相同。自发光的颜色显然跟观察目标自身的材质有关。

而其他光源的光(入射光)照射到某个物体上与物体发生交互时:

  • 一部分被物体表面直接反射,按照一个严格的反射路线传播,这部分就形成了镜面反射
  • 一部分进入物体内部,形成折射或透射,这部分光线也会遵循对应的物理规律,按照一定的路线传播
  • 还有一部分被物体表面细小的凹凸反射,或者进入物体内部与物体内部的粒子经过多次交互后最终又从表面发散出来,这部分光线没有特定的传播路径,也可以认为是均匀的,也就是漫反射

在这中间由于物体可能会吸收部分特定波长的入射光,从而导致出射光的颜色和密度发生变化,因此出射光的颜色和密度往往也会受到物体材质的影响。

所有这些出射光本身的颜色以及进入到我们眼睛的量共同决定了我们最终看到的物体的样子。

光照模型就是以摄像机代替眼睛,计算其所能接收到的出射光的数学模拟方式。

显然,光照模型是一个涉及到 “光源”(入射光的颜色、角度等)、“观察目标”(出射光的颜色、角度)、“观察者”(观察方向) 三方的数学模型。 基于不同类型出射光自身的特性,其计算可能会与这三者中的一个或多个有关。

标准光照模型

标准光照模型理论上只关心直接光照,即光线从光源射出后,只经过与物体的一次交互直接进入摄像机得到的颜色。间接光照的部分通过环境光进行统一概括。

在标准光照模型中,决定观察目标最终颜色的出射光包括四部分:

  • 环境光
  • 自发光
  • 漫反射
  • 高光反射

2. 环境光

  • 用于概括表示光线在环境间多次反射后进入摄像机的颜色
  • 是一个全局指定的颜色,与上文三者均无关
  • Cambient = Gambient
  • 其中 Gambient 为全局指定的环境光颜色

3. 自发光

  • 由观察目标发出,且是均匀的,因此与光源和观察者均无关
  • Cemissive = Memissive
  • 其中 Memissive 为材质自身的自发光颜色
  • 自发光只是表示观察目标本身材质带来的颜色影响,并不是作为真正的光源使用,因此不会照亮其他物体

4. 漫反射

  • 由观察目标反射入射光而来,且出射光均匀,因此与光源和观察目标有关,与观察者无关
  • 符合兰伯特定律:反射光线的强度与表面法线和光源方向之间的夹角的余弦值成正比
  • 两种计算漫反射的模型:
    • 兰伯特模型
      • Cdiffuse = Clight * Mdiffuse * Max(0, n·l)
      • 其中Clight为入射光的颜色,Mdiffuse为材质自身漫反射颜色,n为法线方向,l为光源方向(点到光源)
      • 该模型严格按照兰伯特定律计算,当光源在点背面时,认为不应该被光源照亮,此时ln夹角超过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点乘,当光源、观察目标、观察者三方距离远到一定程度时,lv 几乎不变,可以被看做是定值,此时h也为定值,因而可以跳过求h的过程,此时相比Blinn - Phong模型必须要先与n点乘求反射方向之后再与观察方向v点乘,Blinn - Phong模型计算速度更快。

  • 而当距离不够远时,lv不可看作定值,此时从速度和效果上,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题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; 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文档&#xff0c;标题里面都含有零代码编程&#xff0c;现在想将其替换为AI办公自动化。 在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&am…...

Golang 并发 Mutex 互斥锁的使用

Golang 并发 Mutex 互斥锁的使用 1. 初始化 func TestMutex(t *testing.T) {mu01 : sync.Mutex{}var mu02 sync.Mutex }两种方式都ok 2. Mutex使用 计数器统计&#xff0c;多个协程同时对同一个变量进行 代码示例 var mu sync.Mutex var counter intfunc TestMutexAdd(t…...

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业 1.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&am…...

常见的十二种软件架构

常用的软件架构有多种&#xff0c;以下是一些主要的软件架构风格&#xff1a; 单体架构&#xff08;Monolithic Architecture&#xff09;&#xff1a; 描述&#xff1a;所有功能都集中在一个应用或系统中&#xff0c;易于开发和部署&#xff0c;但随着系统增长&#xff0c;可能…...

数据库出现死锁的解决方法参考

死锁引起的原因一般是多个用户并发访问数据库导致的问题&#xff0c;或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…...

HCIP-Datacom-ARST自选题库_01_防火墙【6道题】

一、单选题 1.在防火墙域间安全策略中&#xff0c;请问以下哪一项的数据流不是Outbound方向的? 从Trust区域到DMZ区域的数据流 从Trust区域到Untrust区域的数据流 从Trust区域到Local区域的数据流 从DMZ区域到Untrust区域的数据流 2.如果防火墙域间没有配置安全策路&…...

力扣/leetcode383.比特位记数

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

react18【系列实用教程】useEffect —— 副作用操作 (2024最新版)

什么是副作用操作&#xff1f; useEffect 用于编写由渲染本身引起的对接组件外部的操作&#xff08;官方称呼为&#xff1a;副作用操作&#xff09; 以下情况会触发页面渲染 初次加载页面&#xff08;组的挂载&#xff09;响应式变量发生变化&#xff0c;触发页面根据新值重新…...

Excel 分组汇总后删除明细

有 Excel 数据如下所示&#xff1a; IDCriteria1Criteria2Criteria3Criteria4101210271239312381236123171826182918239182120182147 需要按 ID 分组汇总其余列&#xff0c;结果如下&#xff1a; IDCriteria1Criteria2Criteria3Criteria410121027123932561826939267 解法及简…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...