第一篇 初识庐山真面目 ——Unity 3D Shader(4)
文章目录
- 第四章 基本的光照模型
- 4.1 光源对物体照明的分类
- 4.1.1 间接照明
- 4.1.2 直接照明
- 4.2 照明的计算方式:光照模型
- 4.2.1 漫反射和Lambert
- 4.2.2 镜面高光和Phong
- 4.2.3 半角向量和BlinnPhong
第四章 基本的光照模型
4.1 光源对物体照明的分类
4.1.1 间接照明
在物体所处的环境中,我们可以把照射到物体上的光源简单地分为直接照明和间接照明。间接照明是光在物体间传播后,最终又对物体形成照明。知道3DMAX的人一定会对诸如VRay渲染器渲染出的效果图倍感惊讶,那是因为渲染器在漫长的几十分钟甚至几小时的时间内,通过光线追踪真实的计算了光源的直接照明和间接照明。但是对于3D游戏来说,最大的特点是实时交互,玩家或用户不可能等上半个小时让渲染器把场景渲染好了再做下一个动作,因此对这部分照明进行实时计算在目前是不可能实现的。在实际应用中,这种照明一般是通过预先烘焙得到的。烘焙在后面我们再说,对于实时计算,间接照明一般作为一个常量。
4.1.2 直接照明
如果不考虑光线在物体间的传播,也不考虑光线在物体内部的传播,则光线对物体直接照明,我们把照明的结果分为漫反射和镜面反射两种,其中镜面反射会形成强力的高光。直接照明是实时渲染的重点。
4.2 照明的计算方式:光照模型
4.2.1 漫反射和Lambert
对于粗糙物体表面上的某一点,其亮度应该和入射光线与该点的垂直程度有关,也就是入射光线与此点法线的夹角相关。如果我们用L表示单位长度的入射光线,用C表示到达此点的光线的强度和颜色,用N表示此点的法线,那么,物体表面此点的亮度Lum就可以用下面的公式来表示:
Lum = C*max(0,cos<L,N>)
<L,N>表示的是方向矢量L和N之间的夹角,其cos值也就是这两个方向矢量的点积,在实际计算时,通过Cg标准函数库dot(L,N)来完成。这个值对于背向光线的点来说为负,其实就是对其照明为0,因此,使用标准函数库中的max(0,value)来对结果进行一些控制
如果计算到此为止,可以把按照这种方式对物体进行照明计算的模型叫做Lambert。在Unity的Surface Shader中,有两个内置的Lighting Model函数,分别为LightLambert()和LightingLambert_PrePass(),并分别表示了Forward和Deferred渲染路径下的这种简单照明方式。下图就是一Lambert照明的例子
4.2.2 镜面高光和Phong
下面我们就来考虑一下镜面高光的问题,可以很直接的计算某一光线ray在某一法线为normal的点经反射后的光线,这个反射可以通过Cg标准函数库中的reflect(ray,normal)来完成。如果用R表示光线在此点的单位长反射方向向量,V表示视线的单位方向向量,那么高光部分Spec的计算表示为:
Spec = pow(max(0,cos<R,V>),gloss)
<R,V>表示方向矢量I和N之间的夹角,gloss表示其表面的镜面光滑程度。
再加上前面在Lambert部分提到的对漫反射的计算,就可以得到一个被渲染出的高光物体。如下图所示:
4.2.3 半角向量和BlinnPhong
在上面的高光计算方式中,我们确实计算了一次入射光线的反射,然后考虑此反射光线进入视野的程度。还有一种更简单更易于调节的方法是使用入射光线和视线的中间平均值,即半角向量,然后使用此半角向量和法线计算出一个和视角相关的高光,这种高光计算方式即为BlinnPhong。对于Unity的Surface Shader,Unity在Lighting.cginc中提供了两个BlinnPhong的实现,分别对应于Forward和Deferred渲染路径。实例如下图所示:
注:半角向量
该图片引用于It136022740的博客,如果博主对此感到不适在此表示歉意,并留言我会删除
第一篇 初识庐山真面目 ——Unity 3D Shader(4)相关推荐
- 第一篇 初识庐山真面目 ——Unity 3D Shader(2)
文章目录 第二章 Unity中的Shader(着色器)的形态 2.1 Unity通过ShaderLab来组织Shader 2.1.1 关键字 Shader 2.1.2 使用SubShader组织Sha ...
- 【Linux入门指北】第一篇 初识Linux
目录 前言 一.Linux操作系统的发展历史 1.Linux操作系统的诞生 2.Linux操作系统的发展 1.自由软件基金会(FSF) 2.GPL协议 3.GUN工程 二.Linux的不同发行版本 1 ...
- 【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)
接受平凡,努力出众,承认普通,但拒绝沉沦于平庸.大家好,我是你们的老朋友,小KK. 满满的 前言 什么C语言? 数据类型 变量和常量 定义变量的方法 变量的分类 变量的作用域和生命周期 ...
- HPM6750系列--第一篇 初识HPM6750
一.目的 HPM6750系列--第二篇 搭建Ubuntu开发环境_coder.mark的博客-CSDN博客https://blog.csdn.net/tianizimark/article/detai ...
- STL 第一篇 初识STL
STL 什么是STL STL组成--六大组件 组件一:容器 容器分类 组件二:空间配置器(alloctor) 组件三--算法 组件4--迭代器 什么是迭代器 常见的迭代器 组件五---仿函数 另名:函 ...
- 微软实习生日记 第一篇 初识微软
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本人有幸 ...
- spring el表达式解析_Spring之旅第一篇-初识Spring
目录 一.概述 二.模块 三.动手创建 一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核 ...
- Dialogue System for Unity文档中文对照版(简雨原创翻译)第一篇(我们开始仙剑demo的剧情)
这篇文档本身有快300页,因为实在太多,所以不像前面的插件那样翻译的,很多地方直接用了机翻,因为文字量实在太大,如果翻译完全套,再加上讲解的话,估计要花几个月的时间,对于普通的程序来说,其实 ...
- 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
最新文章
- 图像处理复习整理(5.图像去模糊)
- Keras下载的数据集以及预训练模型保存在哪里
- python的ind,相当于Python中的MATLAB ind2sub
- JAVA 邮件发送工具类
- zhlan--Python中的字典遍历方法 字典取值
- reduce_sum()中的reduction_indices
- nginx输出日志_ingressnginx持久化日志
- j2ee建立在线聊天室详细教程(第一天登陆页面)
- 天翼网关刷linux,天翼网关3.0-中兴F650光猫最新固件 开Telnet教程
- Raspberry Pi Pico实践系列1-Windows环境下树莓派Pico迷你开发板MicroPython快速上手实践
- The bussiness flow between DWM and ECC
- Arcpy基础入门-3、arcpy创建地理处理工具
- 面试归来——梳理社招面试以及浅述对程序员职业生涯的看法
- C语言写一个函数,输入一行字符,将此字符串中最长的单词输出
- DWM1000 测距原理简单分析 之 SS-TWR
- 小姐姐想学Python 自动化测试,京东大牛彻夜未眠整理的学习方法!
- matlab 中的三次样条插值函数spline使用说明
- 【摘苹果】scratch蓝桥杯集训题目
- 计算机语言中函数的概念,什么是函数,什么是公式,两者的概念讲解及比较
- COC部落冲突自动找鱼 python脚本
热门文章
- 123.Oracle数据库SQL开发之 数据库对象——对象创建
- 禁止APP内部截屏,系统截屏都不好使
- 了解时间复杂度以及时间复杂度的计算
- 提防PQMAGIC和GHOST的误操作
- element中table组件根据属性合并行数据
- Ubuntu关机最后一行提示a start job is running for hold,导致关机很慢
- 3D软件教程:浩辰3D软件中如何进行个性化设置?
- JAVA中常见练习题
- 移花接木:借助 IViewLocationExpander 更换 ASP.NET Core View Component 视图路径
- python 正则表达式判断_Python 正则表达式