【TA100】图形 2.4 传统经验光照模型详解

news2024/11/28 11:44:36

一、光照模型

● 一种模拟自然光照过程的计算机模型
● 本次课程可以这样理解:光线与物体表面的作用
● 分类
○ 基于物理的光照模型(PBR)(有可依据的公式)
○ 经验模型(进行了一些近似、模拟,所以会不准)

光照模型发展历史
在这里插入图片描述

二、局部光照模型

1.局部光照的定义
● 只考虑光源的影响,不考虑光线多次反射
● (对应的概念:全局光照=直接光照+间接光照)
在这里插入图片描述

①漫反射

计算:Lambert余弦定理
在这里插入图片描述
● 补充:
○ 首先其中对应GAMES101中的辐射度量学中的一个概念
■ Irradiance翻译为辐照度
○ Lambert余弦定律结论:n(法线方向)和 l(光照方向)的夹角决定了明暗

②高光项(镜面反射)

在这里插入图片描述
● 高光项中,和光的方向l有关
● 补充
○ blinn-phong模型中,引入了“半程向量”,用来代替反射的计算
○ gloss指数的作用:控制高光的大小。(就是GAMES101-blinn-phone模型中的p指数)

③环境光

在这里插入图片描述

④自发光

在这里插入图片描述

3.局部光照总体效果总览
在这里插入图片描述

三、经典光照模型

1.Lambert模型

在这里插入图片描述

//定义顶点shader
			v2f vert(a2v v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				//把法线转化到世界空间
				float3 worldNormal = mul(v.normal, (float3x3)_World2Object);
				//归一化法线
				worldNormal = normalize(worldNormal);
				//把光照方向归一化
				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
				//根据兰伯特模型计算顶点的光照信息,dot可能有负值,小于0的部分可以理解为看不见,直接取0
				fixed3 lambert = max(0.0, dot(worldNormal, worldLightDir));
				//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
				o.color = fixed4(lambert * _Diffuse.xyz * _LightColor0.xyz, 1.0);
				return o;
			}
 
			//定义片元shader
			fixed4 frag(v2f i) : SV_Target
			{
				return i.color;
			}
 
			//使用vert函数和frag函数
			#pragma vertex vert
			#pragma fragment frag	
 
			ENDCG
		}
 
	}


2.Phone模型

在这里插入图片描述

 //顶点着色器
                v2f vert(a2v v){
                    v2f o;
                    //顶点转换到裁切空间坐标
                    o.pos = UnityObjectToClipPos(v.vertex);
                    //顶点法线转换到世界空间
                    o.worldNormal = UnityObjectToWorldNormal(v.normal);
                    //顶点位置转换到世界空间坐标
                    o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                    //顶点着色器纹理的UV坐标
                    o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                    return o;
                }

                //片元逐像素实现
                fixed4 frag(v2f i) : SV_Target {
                    //世界空间下法线方向
                    fixed3 worldNormal = normalize(i.worldNormal);
                    //世界空间下光照方向
                    fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                    
                    //tex2D()纹理采样
                    //得到材质反射率
                    fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;
                    //得到光照下材质反射率
                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
                    //计算环境光
                    fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));

                    fixed3 viewDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                    fixed3 halfDir = normalize(worldLightDir + viewDir);
                    //计算高光反射
                    fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal, halfDir)), _Gloss);            
                    return fixed4(ambient + diffuse + specular, 1.0);			
                }
             

3.Blinn-Phone模型

在这里插入图片描述
● 对Phong模型进行了改进,不用反射向量来计算高光
● 关键:引入了半程向量h

● 半程向量的计算:光照方向和观察方向相加,再归一化
● NdotH:就是半程向量和法线向量的夹角的余弦。得到高光方向

4Phong模型和Blinn-Phong模型的区别

在这里插入图片描述

5.Gourand模型

在这里插入图片描述

6.Flat模型

在这里插入图片描述

7.提到的光照模型的展示

在这里插入图片描述

能量守恒在基础光照模型中的作用

首先搞懂渲染中能量守恒的概念。

● 传统光照模型中,漫反射部分认为光会被均匀的反射到不同的方向。
● 但是在微表面理论中认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。根据平面粗糙程度的不同,这些细小镜面的取向排列可以相当不一致。如图,产生的效果就是:一个平面越是粗糙,这个平面上的微平面的排列就越混乱。这些微小镜面这样无序取向排列的影响就是,当我们特指镜面光/镜面反射时,入射光线更趋向于向完全不同的方向发散(Scatter)开来,进而产生出分布范围更广泛的镜面反射。而与之相反的是,对于一个光滑的平面,光线大体上会更趋向于向同一个方向反射,造成更小更锐利的反射:
在这里插入图片描述
● 我们假设一个粗糙度的参数,然后用统计学的方法来概略的估算微平面的粗糙程度。基于一个平面的粗糙度来计算出某个向量的方向与微平面平均取向方向一致的概率,这个向量就是Blinn-Phong模型中的半程向量 h 。
● 微平面的取向方向与中间向量的方向越是一致,镜面反射的效果就越是强烈越是锐利。然后再加上一个介于0到1之间的粗糙度参数,这样我们就能概略的估算微平面的取向情况了:

微平面近似法使用了这样一种形式的能量守恒(Energy Conservation):出射光线的能量永远不能超过入射光线的能量(发光面除外)。如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降。如果不管反射轮廓的大小而让每个像素的镜面反射强度(Specular Intensity)都一样的话,那么粗糙的平面就会放射出过多的能量,而这样就违背了能量守恒定律。这也就是为什么正如我们看到的一样,光滑平面的镜面反射更强烈而粗糙平面的反射更昏暗。

在这里插入图片描述
● 能量守恒(Energy Conservation):出射光线的能量永远不能超过入射光线的能量(发光面除外)。
● 如上图,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降。如果不管反射轮廓的大小而让每个像素的镜面反射强度(Specular Intensity)都一样的话,那么粗糙的平面就会放射出过多的能量,而这样就违背了能量守恒定律。

而能量守恒对于传统光照模型的作用,我认为可以这么说
● 让人们人知道经验模型的不准确的地方,以改良模型,来实现更真实的效果。
● 引出PBR的概念。
● 为了遵守能量守恒定律,我们需要区分镜面反射(反射),和漫反射(折射)。
● 当一束光线碰撞到一个表面的时候,它就会分离成一个折射部分和一个反射部分。
○ 反射部分就是会直接反射开来而不会进入平面的那部分光线,这就是我们所说的镜面光照。
○ 折射部分就是余下的会进入表面并被吸收的那部分光线,这也就是我们所说的漫反射光照

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小呆的概率论学习笔记】正态分布的代数运算

文章目录 1. 正态分布简介1. 正态分布的数字特征2. 正态分布的代数运算a. 单随机变量的代数运算b. 两个正态分布随机变量的和c. 多个正态分布随机变量的线性组合 1. 正态分布简介 正态分布应该是概率论和数理统计中最重要的一类概率分布,最早的完整论述是由数学王子…

自用-华东师范大学硕士学位论文LATEX模板

文章目录 前言部分页面效果预览使用说明:毕业论文LaTeX模板1. 安装LaTeX发行版和TeX Studio:2. 下载毕业论文模板:3. 编辑论文内容:**标题和作者信息:****摘要和关键词:****章节内容:****图片插…

【Linux】-关于调试器gdb的介绍和使用

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 文章目录 前言一、Linux中的debug和release二、gdb的使用**1.进入调试****2.显示代码*…

配置SSH免密登陆

配置SSH免密登陆 1.生成公私密钥对1)检查是否已存在公私钥对2)生成公私钥对 2.上传公钥到服务器3.ssh-add(mac的坑点)4.使用配置文件连接 博主是MAC用户,文章参考知乎 1.生成公私密钥对 1)检查是否已存在…

Redis高性能设计之epoll和IO多路复用深度解析

一 多路复用 并发多客户端连接, 在多路复用之前最简单和典型的方案:同步阻塞网络IO模型 这种模型的特点就是用一个进程来处理一个网络连接(一个用户请求),比如一段典型的示例代码如下: //直接调用recv函数…

【Java】JAVASE面向对象知识点总结

面向对象 概念 现实生活: ​ 类:抽象的概念,把具有相同特征和操作的事物归为一类 ​ 先有实体,再有类的概念 代码世界: ​ 类:抽象的概念,把具有相同属性和方法的对象归为一类 ​ 编写顺序&…

epoll的LT与ET模式以及阻塞和非阻塞

文章目录 1、基本概念2、关于在socket和EPOLL中的阻塞与非阻塞3、几种IO模型的触发方式4、代码验证5、总结 1、基本概念 Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次…

Flask-蓝图

1、使用步骤&#xff1a; 创建蓝图 blue Blueprint("myblue01", __name__) 使用蓝图装饰视图函数 blue.route(/) def index():return index 将蓝图注册到app中 from appdemo_blueprint import blue app.register_blueprint(blue) 2、以包的形式使用蓝图 <…

Java007——Java注释学习

围绕以下3点介绍&#xff1a; 1、什么是Java注释&#xff1f; 2、Java注释的作用&#xff1f; 3、Java注释长什么样&#xff0c;以及怎么使用Java注释&#xff1f; 一、什么是Java注释&#xff1f; Java注释是在Java程序中用来描述代码的特殊语句。 注释被忽略并且不被编译器…

PyTorch 深度学习 || 专题六:PyTorch 数据的准备

PyTorch 数据的准备 1. 生成数据的准备工作 import torch import torch.utils.data as Data#准备建模数据 x torch.unsqueeze(torch.linspace(-1, 1, 500), dim1) # 生成列向量 y x.pow(3) # yx^3#设置超参数 batch_size 15 # 分块大小 torch.manual_seed(10) # 设置种子点…

javascript基础三十:JavaScript如何实现上拉加载,下拉刷新?

一、前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中 本质上等同于PC网页中的分页&#xff0c;只是交互形式不同 开源社区也有很多优秀的解决方案&#xff0c;如iscroll、better-scroll、pulltorefresh.js库等等 这些第三方库使用起来非常便捷 我们通过原生的方…

哈工大 大数据 数据库实验(3) 物理数据库设计--索引结构

指导书: HIT邹老师数据库实验三资源-CSDN文库 导入数据库 操作 两个元组的分布规律 1.查询元组的数据分布 SELECT COUNT(*) FROM Foo; SELECT COUNT(*) FROM Foo WHERE id 0; SELECT COUNT(*) FROM Foo WHERE a 0; SELECT COUNT(*) FROM Foo WHERE b 0; SELECT COUNT(*…

c++ 解析html与htmlcxx库

目录 1&#xff0c;htmlcxx Github 版本源码下载 2&#xff0c;htmlcxx Linux 版本源码下载 3&#xff0c;htmlcxx 解析例子 1&#xff0c;htmlcxx Github 版本源码下载 正如在前一篇文章 c CFile 类 里提到的&#xff0c;我想要从指定的 html 文件里提取…

【裸机开发】镜像文件内部信息构成

由于当前使用的是裸板&#xff0c;没有OS&#xff0c;DDR的初始化、文件保存地址都尚未确定&#xff0c;所以我们生成二进制文件以后&#xff0c;是无法直接放到开发板上运行的。 因此&#xff0c;我们一般会在二进制文件之前加一些头部信息&#xff0c;这些头部信息会告诉开发…

xsync集群分发脚本

脚本&#xff1a; #!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] thenecho Not Enough Arguement!exit; fi #2. 遍历集群所有机器 for host in hadoop02 hadoop03 doecho $host #3. 遍历所有目录&#xff0c;挨个发送for file in $do#4. 判断文件是否存在if [ -e $file ]th…

文本三剑客awk:命令讲解

awk-命令讲解&#xff1a; 一、awk&#xff1a; 1.定义&#xff1a; &#xff08;1&#xff09;在 Linux/UNIX 系统中&#xff0c;awk 是一个功能强大的编辑工具&#xff0c;逐行读取输入文本&#xff0c;默认以空格或tab键作为分隔符作为分隔。并按模式或者条件执行编辑命令…

006-从零搭建微服务-注册中心(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 核心依赖 需要注册配置中心的服务引入下面 …

步进电机基本原理及驱动方式详解

步进电机基本原理及驱动方式详解 步进电机相关概念基本原理类型和结构转子结构定子结构 励磁方式ATD9800 驱动使用实例 参考文献 步进电机相关概念 步进电机是一种常用于控制和定位应用的电动机&#xff0c;其独特的工作方式使其在许多领域中都具有广泛的应用。步进电机以其 精…

正态总体下常见的抽样分布

1.正态总体下常见的抽样分布 本人博客&#xff1a;总体分布、样本分布、抽样分布的区别 本人博客&#xff1a;三大抽样分布 正态总体下常见的抽样分布意思是&#xff1a;样本来自服从正态分布的总体中&#xff0c;从样本中抽样后得到的分布 1.1 单个正态总体下的抽样分布&…

【高危】GitLab CE/EE 存在存储型XSS漏洞

漏洞描述 GitLab 是一款基于Git的代码托管、版本控制、协作开发平台。 在 GitLab CE/EE 15.11 至 15.11.6 版本以及 16.0 至 16.0.1 版本中&#xff0c;当GitLab导入GitHub仓库时&#xff0c;如果GitHub仓库中包含由用户构造的恶意JavaScript代码的标签颜色&#xff0c;解析这…