UnityShader(九)Unity中的基础光照(下)

目录

标准光照模型

自发光

高光反射

(1)Phong模型

(2)Blinn模型

漫反射

环境光

逐顶点还是逐像素

逐像素光照

逐顶点光照

总结


标准光照模型

光照模型有许多种,但在早期游戏引擎中,往往只使用一个光照模型,被称为标准光照模型。

标准光照模型只关心直接光照,也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。

它的基本方法是,把进入到摄像机内的光线分为四个部分,每个部分用一种方法来计算它的贡献度。

自发光(emissive),这个部分用于描述给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照技术,这些自发光的表面并不会真正地照亮周围地物体,而是它本身看起来更亮了而已。

高光反射(specular),这个部分用于描述当光线从光源照射到模型表面时,该部分会在完全镜面反射方向散射多少辐射量。

漫反射(diffuse),这个部分用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。

环境光(ambient),这个部分用于描述其他所有地简介光照。

自发光

光线可以直接由光源发射进入摄像机而不用经过任何物体反射,标准光照模型使用自发光来计算这个部分的贡献度。

它的计算很简单,就是直接使用了改材质的自发光颜色。

自发光表面往往不会直接照亮周围的表面,它不会被当作是一个光源。

高光反射

(1)Phong模型

这里的高光反射是一种经验模型——不完全符合真实世界中的高光反射现象。用于计算沿着完全镜面反射方向的光线,让物体看起来更有光泽。

计算高光反射我们需要知道:表面法线、视角方向、光源方向、反射方向。我们只要知道前三个矢量(都进行了归一化),反射方向可以通过计算得到,计算公式如下:

r是反射方向、n是法线方向、I是光源方向。

高光反射部分计算公式如下:

       

其中,mgloss是材质的光泽度,也被称为反光度。用于控制高光区域的“亮点”有多宽,mgloss越大,亮点越小。mspscular是材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色。clight则是光源颜色和强度。同样,这里也需要防止v·r的结果为负数。

(2)Blinn模型

和上述的Phong模型相比,Blinn提出了一个简单的修改方法来得到类似的结果。它的基本思想是,避免计算反射方向r。为此,Blinn模型引入了一个新的矢量h,它是通过对vI的取平均后再归一化得到的

然后,使用nh之间的夹角进行计算,而非vr之间的夹角,
总结,Blinn模型公式为

        这两种模型各有优劣。如果摄像机和光源距离模型足够远的话,Blinn会快于Phong,因为这个时候 v I 都可以看成定值,h 将是一个常量。反之Phong可能更快。

漫反射

漫反射是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。在漫反射中视角位置是不重要的,因为反射是完全随机的,但是入射光线的角度是很重要的。

漫反射光照符合兰伯特定律(Lambert's law):反射光线的强度与表面的法线和光源方向之间夹角的余弦成正比。

 n是表面法线,I是指向光源的单位矢量,m_{diffuse}是材质的漫反射颜色,c_{light}是光源的颜色。我们需要防止法线和光源方向的点乘为负值,所以用取最大值函数将其截取到0,可以防止物体被从后面来的光源照亮。

环境光

虽然标准模型重点在于描述直接光照,但是在现实生活中物体可也可以被间接光照所照亮。

间接光照指光线通常会在多个物体间反射,最后进入摄像机。例如在红地毯上放一个浅灰色的小球,那么小球的底部就会有红色,这些红色是由红地毯反射了一部分光线,再反弹到沙发上的。

在标准光照模型中,我们使用环境光来近似模拟间接光照,它通常是一个全局变量,即场景中的所有物体都使用这个环境光。

逐顶点还是逐像素

上述给出了基本光照模型的数学公式,我们在何处计算这些光照模型呢?

通常来讲,我们可以选择在片元着色器中计算,也被称为逐像素光照;在顶点着色器中计算,也被称成为逐顶点光照

逐像素光照

我们会以每个像素为基础得到它的法线(可以是对顶点法线插值得到的,也可以是从法线纹理中采样得到的),然后计算光照模型。这种在面片之间对顶点法线进行插值的技术被称为Phong着色,也被称为Phong插值或法线插值着色技术

逐顶点光照

也被称为高洛德着色。我们在每个顶点上计算光照,然后会在渲染图元内部进行线性插值,最后输出成像素颜色。

由于顶点数目往往小于像素数目,因此逐顶点光照计算量往往小于逐像素光照。但是由于逐顶点光照依赖于线性插值得到的像素光照,因此当光照模型中有非线性的计算(如计算高光反射)时,逐顶点光照就会出现问题。

总结

标准光照模型仅仅是一个经验模型,它不完全符合现实世界的光照现象,但是它具有易用性、计算速度和得到的效果都比较好,也被广泛使用。因为广泛使用,它有许多称呼,一些资料会称它为Phong光照模型,在Blinn的方法简化下它也被称为Blinn-Phong光照模型

但这种模型有很多局限性。首先有很多重要的物理现象无法表现,如菲涅尔反射。其次,Blinn-Phong模型各项同性的,当我们固定视角和光源方向旋转这个表面时反射不会发生任何变化。而有些表面是具有各项异性的。

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

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

相关文章

linux -- 并发 -- 并发来源与简单的解决并发的手段

互斥与同步 当多个执行路径并发执行时,确保对共享资源的访问安全是驱动程序员不得不面对的问题 互斥:对资源的排他性访问 同步:对进程执行的先后顺序做出妥善的安排 一些概念: 临界区:对共享的资源进行访问的代码片段…

1、缓存击穿背后的问题

当面试官问:你知道什么是缓存击穿吗,你们是如何解决的? 首先我们要了解什么是缓存击穿?以及缓存击穿会引发什么问题? 缓存击穿就是redis中的热点数据过期,缓存失效,导致大量的请求直接打到数据…

【免费分享】数据可视化-银行动态实时大屏监管系统,含源码

一、动态效果展示 1. 动态实时更新数据效果图 ​ 2. 鼠标右键切换主题 二、确定需求方案 1. 屏幕分辨率 这个案例的分辨率是16:9,最常用的的宽屏比。 根据电脑分辨率屏幕自适应显示,F11全屏查看; 2. 部署方式 B/S方式:支持…

使用了不受支持的协议。 ERR_SSL_VERSION_OR_CIPHER_MISMATCH的问题解决办法

windwos 2008 R2 使用IIS部署的项目申请使用https协议的时候,通过安全加密协议访问网站提示不受支持的协议 错误原因分析 这种错误通常表示客户端和服务器之间存在协议版本或加密套件不兼容导致在SSL(Secure Socket Layer) 1.协议版本不兼容&…

壹[1],Xamarin开发环境配置

1,环境 VS2022 注: 1,本来计划使用AndroidStudio,但是也是一堆莫名的配置让人搞得很神伤,还是回归C#。 2,MAUI操作类似,但是很多错误解来解去,且调试起来很卡。 3,最…

哪个牌子的头戴式耳机好?推荐性价比高的头戴式耳机品牌

随着科技的不断发展,耳机市场也呈现出百花齐放的态势,从高端的奢侈品牌到亲民的平价品牌,各种款式、功能的耳机层出不穷,而头戴式耳机作为其中的一员,凭借其优秀的音质和降噪功能,受到了广大用户的喜爱&…

C++文件操作(2)

文件操作(2) 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件 用二进制方式打开文本存储的文件时,也可以读取其中的内容,因为文本文件…

Flask 入门3:Flask 请求上下文与请求

1. 前言 Flask 在处理请求与响应的过程: 首先我们从浏览器发送一个请求到服务端,由 Flask 接收了这个请求以后,这个请求将会由路由系统接收。然后在路由系统中,还可以挂入一些 “勾子”,在进入我们的 viewFunction …

【C++】开源:Windows图形库EasyX配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Windows图形库EasyX配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#…

✅Redis 常见数据类型和应用场景(详解)

Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合&…

揭开时间序列的神秘面纱:特征工程的力量

目录 写在开头1. 什么是特征工程?1.1 特征工程的定义和基本概念1.2 特征工程在传统机器学习中的应用1.3 时间序列领域中特征工程的独特挑战和需求3. 时间序列数据的特征工程技术2.1 数据清洗和预处理2.1.1 缺失值处理2.1.2 异常值检测与处理2.2 时间特征的提取2.2.1 时间戳解析…

循环——枚举算法2(c++)

目录 找和为K的两个元素 描述 在一个长度为n(n < 1000)的整数序列中&#xff0c;判断是否存在某两个元素之和为k。 输入 第一行输入序列的长度n和k&#xff0c;用空格分开。 第二行输入序列中的n个整数&#xff0c;用空格分开。 输出 如果存在某两个元素的和为k&…

个人建站前端篇(一)项目准备初始化以及远程仓库连接

云风的知识库 云风网前端重构&#xff0c;采用vue3.0vite antd框架&#xff0c;实现前后端分离&#xff0c;实现网站的SEO优化&#xff0c;实现网站的性能优化 vite创建vue项目以及前期准备 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高…

STM32存储左右互搏 QSPI总线读写FLASH W25QXX

STM32存储左右互搏 QSPI总线读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库Qual SPI总线操作W25Q各型号FLASH的例程。 W25Q…

游泳耳机要怎么选购?一篇文章告诉你如何选购游泳耳机

在进行运动时享受音乐的乐趣是许多人的喜好&#xff0c;对于在地面展开的一般运动&#xff0c;选择耳机相对简单&#xff0c;但若是涉及水中游泳&#xff0c;我们就需要一款具备防水性能的专业游泳耳机。市面上已有数款针对游泳设计的防水耳机&#xff0c;本文将为您详细介绍如…

【解刊】审稿人极其友好!中科院2区SCI,3个月录用,论文质量要求宽松!

计算机类 • 高分快刊 今天带来Springer旗下计算机领域高分快刊&#xff0c;有投稿经验作者表示期刊审稿人非常友好&#xff0c;具体情况一起来看看下文解析。如有投稿意向可重点关注&#xff1a; 01 期刊简介 Complex & Intelligent Systems ✅出版社&#xff1a;Sprin…

光杆司令如何部署大模型?

1、背景 今天这种方式非常贴合低配置笔记本电脑的小伙伴们, 又没有GPU资源, 可以考虑使用api方式,让模型服务厂商提供计算资源 有了开放的api,让你没有显卡的电脑也能感受一下大模型管理知识库,进行垂直领域知识的检索和问答.算是自己初步玩一下AI agent 之前有写过一篇《平民…

Java二维码图片识别

前言 后端识别二维码图片 代码 引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing<…

软件压力测试:探究其目的与重要性

随着软件应用在各行各业中的广泛应用&#xff0c;确保软件在高负载和极端条件下的稳定性变得至关重要。软件压力测试是一种验证系统在不同负载条件下的性能和稳定性的方法。本文将介绍软件压力测试的目的以及为什么它对软件开发和部署过程至关重要。 验证系统性能的极限&#x…

二、人工智能之提示工程(Prompt Engineering)

黑8说 岁月如流水匆匆过&#xff0c;哭一哭笑一笑不用说。 黑8自那次和主任谈话后&#xff0c;对这个“妖怪”继续研究&#xff0c;开始学习OpenAI API&#xff01;关注到了提示工程(Prompt Engineering)的重要性&#xff0c;它包括明确的角色定义、自然语言理解&#xff08;…
最新文章