第四天 开始Unity Shader的学习之旅之Unity中的基础光照

news2025/3/29 3:31:00

Unity Shader的学习笔记

第四天 开始Unity Shader的学习之旅之Unity中的基础光照


文章目录

  • Unity Shader的学习笔记
  • 前言
  • 一、我们是如何看到这个世界的
    • 1. 光源
    • 2.吸收和散射
    • 3.着色
  • 二、标准光照模型
    • 1. 自发光
    • 2. 高光反射
      • ① Phong模型
      • ② Blinn-Phong模型
    • 3.漫反射
    • 4.环境光
  • 总结


前言

渲染总是围绕一个基础问题:我们如何决定一个像素的颜色?从宏观上来说,渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算,而光照模型就是用于决定这一像素上进行怎样的光照计算.今天我们会介绍一下这一章的基本知识,明天再对代码进行详细解释.


一、我们是如何看到这个世界的

1. 光源

光不是从石头缝里面蹦出来的,而是由光源发射出来的,在实时渲染中,我们通常把光源当成一个没有体积的点,用l来表示他的方向,在光学中,我们使用辐照度来量化光,对于平行光来说,他的辐照度可通过计算在垂直于l的单位面积上单位时间内穿过的能量来得到,那如果光照方向和物体表面不是垂直的呢,那我们其实可以使用光源方向l和表面法线n之间的夹角的余弦值来得到.

2.吸收和散射

光线由光源发出后,就会与一些物体相交,相交的结果通常只有两个:散射和吸收.
散射只改变光的方向,不改变光的大小和颜色,光线在经过表面散射后,有两种方向,这两种方向现实生活中我们怎么区分的就不说了,在光照模型中,为了区分这两个不同方向的散射,我们使用不同的部分来计算他们
高光反射部分表示物体表面是如何反射光线的;
漫反射部分部分表示有多少光线会被折射,吸收和散射出表面
在本章中,我们假设漫反射部分是没有方向性的,也就是说,光线在所有方向上都是平均分布的(平行光),同时,我们也只考虑某一个特定方向上的高光反射.

3.着色

着色指的是根据材质属性,光源信息,使用一个等式去计算沿着某个观察方向的出射度的过程,这个等式就是光照模型,本章设计的BRDF光照模型都是对真实场景进行理想化和简化后的模型, 也就是说,他们并不能真实的反应物体和光线之间的交互,因此这些光照模型也被称为经验模型.
但是,你要记住图形学第一定律:如果他看起来是对的,那么他就是对的.

二、标准光照模型

虽然光照模型有很多中,但是早期的游戏引擎往往只使用一个光照模型,那就是标准光照模型.标准光照模型只关心直接光照,也就是那些直接从光源发出照射到物体表面上经过物体的一次反射直接进入摄像机的光线.
他的基本方法是:把进入到摄像机内的光线分为四个部分,每一个部分使用一种方法来计算他的贡献度,这四个部分是:
①自发光部分:本书使用C[^emissive]来表示,这个部分用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量.
②高光反射部分:本书使用C[^specular] 来表示,这个部分用于描述当光线从光源照射到模型表面时,该表面会在镜面反射方向散射多少辐射量.
③漫反射部分:本书使用C[^diffuse] 来表示,这个部分用于描述当管线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量.
④环境光部分:本书使用C[^ambient] 来表示,它用于描述其他所有的简介光照.

1. 自发光

自发光的计算肥肠煎蛋,就是直接使用了该材质表面的自发光颜色,因此在实时渲染中,自发光的物体不能作为一个光源,所以自发光的表面不会照亮周围的表面,只是会比环境更亮一些.下面为自发光的计算公式:
自发光的计算公式

2. 高光反射

① Phong模型

这里的高光反射是一种经验模型,她并不符合真实世界的高光反射现象,高光反射的计算需要的信息就比较多了,如表面法线n,视角方向v,光源方向l,反射方向r等,在本书中,我们假设这些方向都是单位矢量,反射方向可以由其他三个变量计算得来,公式如下:
Phong模型计算反射方向
有了这四个变量,我们就可以通过Phong模型来计算高光反射的部分了,公式如下:
Phong模型
其中mgloss表示材质的光泽度,也称为反光度,mgloss越大,高光反射的亮点就越小, mspecular是材质的高光反射的颜色,他表示材质的高光反射的颜色和强度,clight则是光源的颜色和强度,为了避免视角方向和反射方向的点积为负数,我们使用max来限制其最小值为0.

② Blinn-Phong模型

为了避免计算反射方向,Blinn模型引入了新的矢量h,计算公式如下:
Blinn-Phong模型的的h变量计算
然后通过下面的同时计算高光反射的部分的颜色和强度.
Blinn-Phong模型

3.漫反射

在漫反射中,视角方向是不重要的,因为反射是完全随机的,因此可以认为任何反射方向上的分布都是一样的,但是入射光线的角度很重要.
漫反射符合兰伯特定律,漫反射的计算公式如下:
兰伯特定律
其中, n是表面法线,l是指向光源的单位矢量,mdiffuse是材质的漫反射颜色,clight是光源颜色,为了避免法线和光源方向点乘的结果为负值,我们使用max将其最小值截取至0;

4.环境光

在标准光照模型中,我们使用环境光来模拟间接光照,环境光的计算肥肠煎蛋,它通常是一个全局变量,即场景中的所有物体都使用这个环境光,下面是计算环境光的公式:
环境光的计算公式


总结

今天主要是对标准光照模型的四个部分进行了一个大致介绍,明天在Unity Shader对这些知识点进行讲解!!!

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

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

相关文章

基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统模块功能结构图 局部E-R图 系统首…

Java-空链基础入门

经过调研和细致观察,我们发现空链对于初次接触或是对Stream和Optional不太熟悉的人来说,确实存在一定的上手难度,宛如开启了“地狱模式”。为了降低这一门槛,我们决定通过一系列由简入深的案例演示,来逐步引导大家掌握…

【江协科技STM32】Unix时间戳BKP备份寄存器RTC实时时钟(学习笔记)

Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同,不同时区通过…

3.17-3.23 Web3 游戏周报:Pixudi 双榜领跑,The Forgotten Runiverse 登陆三大主机平台

回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.17–3.23】Web3 游戏行业动态 Ronin 将与 Alpha Growth 等合作推出 1300 万美元增长计划,以向 DeFi 扩张Notcoin 开发工作室 Open Builders 宣布推出 Not Games …

AppInventor2生成3位数的水仙花数

生成3位水仙花数(每位数字的立方之和刚好等于这个数字)的代码,如下: 来源:【生成Python】AppInventor2中文网已支持代码块转换Python源码! - App Inventor 2 中文网 - 清泛IT社区,为创新赋能&…

【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类

【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类 引言:算法背后的认知革命 K-Means与层次聚类,这两个诞生于1960年代的算法,至今仍是工业界使用率最高的聚类工具。它们分别代表了两种根本性的世界观&am…

[Effective C++]条款22:将成员变量声明为private

. 在C中,将成员变量声明为private而不是public,主要是为了遵循面向对象编程(OOP)的封装原则。他有助于隐藏对象的内部实现细节,提供更好地控制,安全性和可维护性。 1、数据隐藏与封装 将成员变量声明为pr…

心法利器[132] | 大模型系统性能优化trick

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2023年新的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2023年文章合集来袭,更…

六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 深入解析Vue3电商项目:TechStore全栈实践 一、项目架构设计 二、核心功能实现 三、组合式API深度实践 四、性能优化实践 五、项目扩展方向 六、开发经验总结…

类与对象(中)(详解)

【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗&…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域,卷积神经网络(CNN)一直是图像处理任务的主流架构。然而,随着网络深度的增加,梯度消失和梯度爆炸问题逐渐显现,限制了网络的性能。为了解决这一问题,ResNet(残差…

Flutter项目之页面实现以及路由fluro

目录: 1、项目代码结构2、页面编写以及路由配置main.dart(入口文件)page_content.dartindex.dartapplication.dartpubspec.yamllogin.dartdio_http.dart 3、Fluro路由routes.dartnot_found_page.dart(路由优化,找不到页面时展示此页面) 4、注册页面 1、项…

《Python实战进阶》第31集:特征工程:特征选择与降维技术

第31集:特征工程:特征选择与降维技术 摘要 特征工程是机器学习和数据科学中不可或缺的一环,其核心目标是通过选择重要特征和降低维度来提升模型性能并减少计算复杂度。本集聚焦于特征选择与降维技术,涵盖过滤法、包裹法、嵌入法等…

C++类与对象的第二个简单的实战练习-3.24笔记

哔哩哔哩C面向对象高级语言程序设计教程(118集全) 实战二 Cube.h #pragma once class Cube { private:double length;double width;double height; public:double area(void);double Volume(void);//bool judgement(double L1, double W1, double H1);…

Rk3568驱动开发_设备树点亮LED_10

设备树中添加节点 在设备树文件中添加led节点,添加完后需要重新编译内核,因为单独编译这个设备树文件生成的dtb文件目前不能直接做替换,所以要编译内核将编译好的boot.img文件烧录到设备里,boot.img里包含新添加的设备树节点&…

Unity学习之Shader(Phong与Blinn-Phong)

三、Lesson3 1、关键名称 向量 • nDir:法线方向,点乘操作时简称n; • lDir:光照方向,点乘操作时简称l; • vDir:观察方向,点乘操作时简称v; • rDir:光反…

uniapp笔记-swiper组件实现轮播图

思路 主要就是参考 swiper | uni-app官网 实现轮播图。 实例 新建一个banner.vue通用组件。 代码如下&#xff1a; <template><view>轮播图</view> </template><script> </script><style> </style> 随后在index.vue中导…

【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

FPGA_YOLO(二)

上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…

蓝桥杯学习-14子集枚举,二进制枚举

子集枚举 一、回溯3-子集枚举&#xff08;递归实现指数型枚举&#xff09; 一旦涉及选与不选&#xff0c;删和不删&#xff0c;留和不留-->两种状态-->就要想到子集枚举例题1–递归实现指数型枚举19685 其实看不懂这个题目&#xff0c;好奇怪的题目。根据老师的解析来写…