传统经验光照模型

1.什么是光照模型

       光照模型(illumination model),也称为明暗模型,用于计算物体某点处的光强(颜色值),从算法理论基础而言,光照模型分为两类,一种是基于物理理论的,另一种是基于经验模型的。
基于物理理论的光照模型:偏重于使用物理的度量和统计方法,效果非常真实,但是计算复杂,实现起来也较为困难;
经验模型:是对光照的一种模拟,通过实践总结出简化的方法,简化了真实的光照计算,并且能达到很不错的效果

1.1为什么需要光照模型

现实世界的光照是极其复杂的,而且会受到诸多因素的影响,有限的计算能力无法完全模拟。
使用简化的光照模型对现实的情况进行近似,使得计算处理起来会更容易,并且令效果更符合需
这些光照模型就是基于我们对光的物理特性的理解。

2.局部光照模型

2.1局部光照模型的定义

局部光照模型只关心直接光照部分,即直接从光源发出并照射到物体表面并反射至摄像头的光线,对应下面左图的情况,右边的这种一束光线会经过多次反射才会反射到视线中的叫做全局光照

2.2局部光照模型的组成

局部光照模型满足叠加原理,可以基本将光线分为四个部分,漫反射,高光反射,环境光,自发光

2.3漫反射

什么是漫反射?
在光照模型的定义中,当光线从光源照射到模型表面时,光线均匀被反射到各个方向,这种现象就是漫反射。在漫反射的过程中,光线发生了发生了吸收和散射,而因此改变颜色和方向。
如何计算?
漫反射光照符合Lambert定律,反射光强与法线和光源方向之间的夹角的余弦值成正比

2.4高光反射

2.5环境光


2.6自发光


3.经典光照模型

3.1Lambert模型

无高光,可以做类似橡胶材质效果

3.2Phong模型

3.3Blinn-Phong模型

Phone模型和Blinn-Phone模型的区别

通过对Phone模型的公式和Blinn-Phone模型公式的对比,可以知道公式的不同之处在于使用了半角向量与法线的点积代替了反射向量与视线的点积结果.


半角向量的使用带来了什么变化?
1.计算更加简洁,半角向量比反射向量的计算更加简洁
2.当光源与视线都在物体表面之上时,半角向量与法线的角度永远不大于90度
设想一种情况,当材质的反光度非常低,因此物体被光线照射的大部分区域都会发生高光反射。这些区域中一部分高光部分的反射问量与视线的夹角超过了90度。
如果使用Phone模型就会导致高光区域一部分发生缺失。这是由于phone模型只考虑视线与光照分布在法线两侧的情况,当视线与光照在法线同侧时且高光反射对亮度有较影响时,就会发生断层。

4.代码实现Phong和Blinn-Phong

Shader "Custom/Specular"
{Properties{_SpecularColor("高光反射颜色",COLOR)=(1,1,1,1)_Diffuse("漫反射颜色",COLOR)=(1,1,1,1)_shinness("光泽度",Range(1,64))=8}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include"Lighting.cginc"fixed4 _Diffuse;fixed4 _SpecularColor;float _shinness;struct v2f{float4 pos:POSITION;float4 color:COLOR;};v2f vert (appdata_base v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//将顶点转换到裁剪空间o.color=UNITY_LIGHTMODEL_AMBIENT;//环境光//float3 normal=normalize(v.normal);// float3 L=normalize(_WorldSpaceLightPos0).xyz;//normal=mul(float4(normal,0),unity_WorldToObject).xyz;//normal=normalize(normal);//漫反射部分float3 L=normalize(WorldSpaceLightDir(v.vertex)).xyz;float3 normal = UnityObjectToWorldNormal(v.normal);//float ndotl=saturate(dot(normal,L));//兰伯特模型float ndotl=0.5*(dot(normal,L))+0.5;//半兰伯特模型o.color+=ndotl*_LightColor0*_Diffuse;//高光反射部分//Phong模型/*    float3 R=reflect(-L,normal);float3 V=WorldSpaceViewDir(v.vertex);R=normalize(R);V=normalize(V);o.color.rgb+=_LightColor0*_SpecularColor*pow(saturate(dot(R,V)),_shinness);*///Blinn-Phong 光照模型float3 V=WorldSpaceViewDir(v.vertex);V=normalize(V);float3 H=normalize(L+V);o.color.rgb+=_LightColor0*_SpecularColor*pow(saturate(dot(H,normal)),_shinness);return o;}fixed4 frag (v2f i) : COLOR{return i.color;}ENDCG}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融市场和预期

1.债券的分类 短期债券(Short-term Bonds): 通常指到期期限在1年以内的债券。 中期债券(Medium-term Bonds): 到期期限在1年到10年之间的债券。 长期债券(Long-term Bonds)&#xff…

C++:用红黑树封装map与set-2

文章目录 前言一、红黑树封装map与set中const迭代器1. 框架的搭建2. set实现const迭代器3. map实现const迭代器 二、operator[ ]1. operator[ ]要达成的样子2. insert的改变 三. 解决insert里set中的问题四. 解决map中的operator[ ]总结用红黑树封装map与set代码 前言 前面我们…

软件/游戏提示:mfc42u.dll没有被指定在windows上运行如何解决?多种有效解决方法汇总分享

遇到“mfc42u.dll 没有被指定在 Windows 上运行”的错误提示,通常是因为系统缺少必要的运行库文件或文件损坏。以下是多种有效的解决方法,可以帮助你解决这个问题: 原因分析 出现这个错误的原因是Windows无法找到或加载MFC42u.dll文件。这可…

07 初始 Oracle 优化器

查询优化器,简称优化器,是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了,优化器会参与到SQL语句的解析过程中,用来生成SQL语句的执行计划,直接决定SQL语句执行性能的优劣。 什么是执行计划 …

累积局部效应 (ALE) 图分析记录

Git地址:https://github.com/blent-ai/ALEPython/tree/dev 查看源码需要pip install alepython安装,这边查看源码发现就实际就一个py文件而已,我懒得再去安装,故直接下载源码,调用方法也可; # -*- coding:…

远程控制软件:探究云计算和人工智能的融合

在数字化时代,远程控制工具已成为我们工作与生活的重要部分。用户能够通过网络远程操作和管理另一台计算机,极大地提升了工作效率和便捷性。随着人工智能(AI)和云计算技术的飞速发展,远程控制工具也迎来了新的发展机遇…

正则表达式灾难:重新认识“KISS原则”的意义

RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门,从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗? 把业务逻辑写入数据库,重新定义简单与效率。…

网络原理(一):应用层自定义协议的信息组织格式 初始 HTTP

目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…

【JUC-Interrupt】中断相关概念

线程中断 一、相关概念二、API2.1、isInterrupted方法2.2、interrupted方法2.3、interrupt 三、总结: 一、相关概念 一个线程不应该由其他线程中断或停止,应该有线程自己来决定。 在Java中没有办法立即停止一个线程,因此提供了用于停止线程…

直播技术-Android基础框架

目录 (一)直播间架构 (二)核心任务调度机制 (1)复制从滑动直播间加载流程 (2)核心任务调度机制-代码设计 (3)核心任务调度机制-接入指南 (三&#xff0…

【es6】原生js在页面上画矩形添加选中状态高亮及显示调整大小控制框(三)

接上篇文章,这篇实现下选中当前元素显示调整大小的控制框,点击document取消元素的选中高亮状态效果。 实现效果 代码逻辑 动态生成控制按钮矩形,并设置响应的css // 动态添加一个调整位置的按钮addScaleBtn(target) {const w target.offsetWidth;con…

ArcGIS应用指南:ArcGIS制作局部放大地图

在地理信息系统(GIS)中,制作详细且美观的地图是一项重要的技能。地图制作不仅仅是简单地将地理数据可视化,还需要考虑地图的可读性和美观性。局部放大图是一种常见的地图设计技巧,用于展示特定区域的详细信息&#xff…

记录一些PostgreSQL操作

本文分享一些pg操作 查看版本 select version(); PostgreSQL 11.11 查看安装的插件 select * from pg_available_extensions; 查看分词效果 select ‘我爱北京天安门,天安门上太阳升’::tsvector; ‘天安门上太阳升’:2 ‘我爱北京天安门’:1select to_tsvector(‘我爱北京天…

RHCSA作业2

压缩 将整个 /etc 目录下的文件全部打包并用 gzip 压缩成/back/etcback.tar.gz [rootjyh ~]# cd /etc [rootjyh etc]# tar -czf etcback.tar.gz /etc tar: Removing leading / from member names tar: /etc/etcback.tar.gz: file changed as we read it [rootjyh etc]# ls使当…

大语言模型(LLM)安全:十大风险、影响和防御措施

一、什么是大语言模型(LLM)安全? 大语言模型(LLM)安全侧重于保护大型语言模型免受各种威胁,这些威胁可能会损害其功能、完整性和所处理的数据。这涉及实施措施来保护模型本身、它使用的数据以及支持它的基…

递推进阶与入门递归

一、递推进阶,勇攀高峰 昆虫繁殖 题目描述 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过X个月产Y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫…

深入浅出:JVM 的架构与运行机制

一、什么是JVM 1、什么是JDK、JRE、JVM JDK是 Java语言的软件开发工具包,也是整个java开发的核心,它包含了JRE和开发工具包JRE,Java运行环境,包含了JVM和Java的核心类库(Java API)JVM,Java虚拟…

极客大挑战2024wp

极客大挑战2024wp web 和misc 都没咋做出来&#xff0c;全靠pwn✌带飞 排名 密码学和re没做出几个&#xff0c;就不发了 web ez_pop 源代码 <?php Class SYC{public $starven;public function __call($name, $arguments){if(preg_match(/%|iconv|UCS|UTF|rot|quoted…

C++设计模式-策略模式-StrategyMethod

动机&#xff08;Motivation&#xff09; 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff0c;经常改变&#xff0c;如果将这些算法都编码到对象中&#xff0c;将会使对象变得异常复杂&#xff1b;而且有时候支持不使用的算法也是一个性能负担。 如何在运…

【初阶数据结构和算法】leetcode刷题之设计循环队列

文章目录 一、实现循环队列1.大致思路分析2.循环队列的结构定义和初始化结构定义初始化 3.循环队列的判空和判满判空和判满难点分析判空判满 4.循环队列的入队列和出队列入队列出队列 5.循环队列取队头和队尾元素取队头元素取队尾元素 6.循环队列的销毁7.最后题解源码 一、实现…