US3S1L3——半兰伯特光照模型
US3S1L3——半兰伯特光照模型
半兰伯特光照模型
半兰伯特光照模型 是 基于兰伯特光照模型进行的修改,主要目的是让背光面可以有明暗变化:
Color漫反射光照=Color光源×Color材质的漫反射×((标准化后物体表面法线向量→⋅标准化后光源方向向量→)×0.5+0.5)Color_{漫反射光照} = Color_{光源} \times Color_{材质的漫反射} \times ((\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量}) \times 0.5 + 0.5)
Color漫反射光照=Color光源×Color材质的漫反射×((标准化后物体表面法线向量⋅标准化后光源方向向量)×0.5+0.5)
单位向量点乘的结果范围
根据数学公式我们知道,假设单位向量A和单位向量B,它们的点乘结果为:
A⃗⋅B⃗=∣A⃗∣∣B⃗∣cosθ\vec{A} \cdot \vec{B} = |\vec{A}||\vec{B}|\cos\theta
A⋅B=∣A∣∣B∣cosθ
cosθ\cos\thetac ...
US3S1L2-2——兰伯特光照模型的逐片元光照
US3S1L2-2——兰伯特光照模型的逐片元光照
知识回顾
兰伯特光照模型公式:
Color漫反射光=Color光源×Color材质的漫反射×max(0,标准化后物体表面法线向量→⋅标准化后光源方向向量→)Color_{漫反射光}=Color_{光源} \times Color_{材质的漫反射} \times \max(0,\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量})
Color漫反射光=Color光源×Color材质的漫反射×max(0,标准化后物体表面法线向量⋅标准化后光源方向向量)
其中,标准化后物体表面法线向量→⋅标准化后光源方向向量→\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量}标准化后物体表面法线向量⋅标准化后光源方向向量 等于物体表面法线与光源方向向量的夹角的 cos\coscos 值
会使用的信息:
光源的颜色
Lighting.cginc 内置文件中的 _LightColor0
光 ...
US3S1L2-1——兰伯特光照模型的逐顶点光照
US3S1L2-1——兰伯特光照模型的逐顶点光照
知识回顾
兰伯特光照模型公式:
Color漫反射光=Color光源×Color材质的漫反射×max(0,标准化后物体表面法线向量→⋅标准化后光源方向向量→)Color_{漫反射光}=Color_{光源} \times Color_{材质的漫反射} \times \max(0,\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量})
Color漫反射光=Color光源×Color材质的漫反射×max(0,标准化后物体表面法线向量⋅标准化后光源方向向量)
其中,标准化后物体表面法线向量→⋅标准化后光源方向向量→\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量}标准化后物体表面法线向量⋅标准化后光源方向向量 等于物体表面法线与光源方向向量的夹角的 cos\coscos 值
会使用的信息:
光源的颜色
Lighting.cginc 内置文件中的 _LightColor0
光 ...
US3S1L2——兰伯特光照模型
US3S1L2——兰伯特光照模型
本章代码关键字
12UNITY_LIGHTMODEL_AMBIENT //兰伯特光照模型环境光变量,对计算出来的结果加上该变量、用于模拟环境光对物体的影响,避免物体阴影部分完全黑暗_WorldSpaceLightPos0 //表示光源0在世界坐标系下的位置
兰伯特光照模型
Color漫反射光=Color光源×Color材质的漫反射×max(0,标准化后物体表面法线向量→⋅标准化后光源方向向量→)Color_{漫反射光}=Color_{光源} \times Color_{材质的漫反射} \times \max(0,\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量})
Color漫反射光=Color光源×Color材质的漫反射×max(0,标准化后物体表面法线向量⋅标准化后光源方向向量)
其中,标准化后物体表面法线向量→⋅标准化后光源方向向量→\overrightarrow{标准化后物体表面法线向量} \cdot \overright ...
US3S1L1——逐顶点光照和逐片元光照
US3S1L1——逐顶点光照和逐片元光照
光照在哪里计算?
具体的光照效果相关的计算,应该写在顶点还是片元着色器中呢?
光照效果的计算在顶点着色器和片元着色器中都可以做
在顶点着色器回调函数中:消耗低,效果差,适合低配设备
在片元着色器回调函数中:消耗高,效果好,适合高配设备
具体在哪里实现,根据项目实际情况而定
我们之后在学习光照模型时,每一种光照模型都会讲解两种实现,即 逐顶点 和 逐片元 光照
逐顶点光照
光照在哪计算:顶点着色器 回调函数中
计算方式:逐顶点光照会在每个物体的顶点上进行光照计算
这意味着光照计算只在物体的顶点位置上执行,而在顶点之间的内部区域使用插值来获得颜色信息(因此计算量少)
优点:逐顶点光照的计算量较小,通常在移动设备上性能较好,适用于移动游戏等要求性能的场景
缺点:照明效果可能不够精细,特别是在物体表面上的细节区域,因为颜色插值可能不足以捕捉到细微的照明变化
适用场景:逐顶点光照适用于需要在有限资源下获得较好性能的场景,例如移动游戏
逐片元光照
光照在哪计算:片元着色器 回调函数中
计算方式:逐片元光照会在每个像素(片元)上进行光照计算
这意味着 ...
US3S3——Shader入门-透明效果
US3S3——Shader入门-透明效果
透明
在 Unity Shader 中实现半透明效果的基本原理就是:利用多个物体或背景的颜色进行混合计算呈现出类似半透明效果
想要实现透明效果,需要掌握如下内容:
渲染标签 —— 渲染队列:确定物体的渲染顺序
渲染状态 —— 深度缓冲:记录像素的深度值,用于之后进行比较,决定片元(颜色)的去留
渲染状态 —— 深度测试:将当前片元深度值和深度缓冲中深度值进行比较,决定片元(颜色)去留
渲染状态 —— 混合方式:将通过深度测试的片元颜色和颜色缓冲区中的颜色按指定算法进行混合,并更新颜色缓冲区
US3S2——Shader入门-纹理效果
US3S2——Shader入门-纹理效果
纹理
模型的骨肉皮分别为:
骨:模型骨骼
肉:三角面片(由模型顶点围成模型的轮廓)
皮:纹理图片
由此可以看出,纹理的主要作用就是使用一张图片来控制模型的外观
使用纹理映射技术,将图片和模型联系起来,让模型能呈现出图片中的颜色表现
纹理映射:是计算机图形学中的一种技术,它用来将图像(纹理)映射到三维模型的表面,
从而赋予模型更加真实和细致的外观,这个过程实际上是将二维图像映射到三维空间的过程
纹理就是模型的“皮”,它决定了模型的颜色表现,在建模时通过纹理映射技术将顶点和纹理图片建立联系
在模型数据中记录顶点对应的UV坐标,之后我们在进行Shader开发时,就可以利用UV坐标从纹理图片中取出对应的颜色,给片元“上色”了
左图为不关联纹理的模型的显示效果(固定为白色),右图为关联的纹理的模型的显示效果
注意
UV坐标的取值范围在 [0~1] 之间
顶点之间的点(片元),会通过插值运算得到对应的UV坐标,从而从纹理图片中取出对应位置的颜色
本系列学习内容:
单张纹理(模型蒙上带颜色的皮,而不再是单一颜色的)
纹理颜色采样
...
US3S1——Shader入门-光照效果
US3S1——Shader入门-光照效果
光照模型
光照模型指的是用于模拟光照效果的一组数学公式和算法,
用于确定在3D场景中的模型表面应该如何对光进行反射和散射,从而实现视觉上逼真的照明效果
也就是说,如果要通过光源让模型拥有光照效果,就需要通过光照模型计算模型各个位置的光照颜色
最左边的红球是不使用光照模型计算光照的显示效果,右边四个球是使用各种光照模型计算过光照的显示效果
之后我们将要学习的光照模型,就是前辈们探索总结出来的计算公式
通过这些光照计算公式的学习,我们可以让3D物体表现出受光照影响的效果
说人话:光照模型就是用来计算光照效果的数学公式,是业界前辈们探索出来的计算规则
在现实生活中,一个物体的颜色是由射进眼睛里的光线决定的,当光线照射到物体表面时,一部分被物体表面吸收,一部分被反射。
对于透明物体,还有一部分光会穿过透明体,产生透射光,只有反射光和透射光才能进入眼镜,从而产生视觉效果(物体呈现出的亮度和颜色)
因此,物体表面的光照颜色是由入射光、物体材质、以及材质和光的交互规律共同决定的
以下是将会学习的光照模型:
漫反射光照模型
漫反射:指光线被粗糙表面无 ...
US3——Shader开发知识
US3——Shader开发知识
前置知识点
Unity Shader 入门相关必备基础知识的学习,其中重要的知识有:
渲染管线相关(应用阶段——>几何阶段——>光栅化阶段)
数学基础相关(点、向量、矩阵、坐标系变换)
语法基础相关(ShaderLab语法、CG语法)
通过这些知识的学习,我们基本上能够大致了解了应该如何进行Shader开发
shader开发知识
我们可以通过CG等语言结合ShaderLab语法规则来编写Shader文件
我们需要在顶点、片元着色器的回调函数中具体实现着色器逻辑
在顶点着色器回调函数中我们利用语义获取到模型中的数据
将数据处理完毕后又传递给片元着色器回调函数中进行处理
还可以结合ShaderLab属性来进行更多的可变处理,从而呈现出不同的表现效果
我们之后学习的大部分Shader相关的知识,其实本质上都是一些计算公式、计算规则(算法)
Shader的本质其实就是利用各种数学计算,呈现出不同的表现效果
本系列学习内容:
Shader入门
学习了这些知识,我们才能实现最基础的渲染效果
光照效果
纹理效果
透明效果(施工中)
Sh ...
US2S3L13——CG内置文件
US2S3L13——CG内置文件
CG内置文件
CG中的内置文件和内置函数一样,是用于帮助我们进行Shader开发的
利用其中的函数、宏、全局变量等内容,可以提升我们Shader的开发效率
如果想要了解更多的内置内容可以参阅Unity官网的资料:
内置文件相关:内置着色器 include 文件 - Unity 手册
函数相关:内置着色器 helper 函数 - Unity 手册
宏相关:内置宏 - Unity 手册
变量相关:内置着色器变量 - Unity 手册
CG内置文件的位置和作用
我们可以在Unity的安装目录中找到CG内置文件,在:编辑器安装目录/Data/CGIncludes 中
后缀为.cginc的文件为CG语言内置文件
后缀为.glslinc的文件为GLSL语言内置文件
他们是预定义的Shader文件,里面包含了一些已经写好的Shader相关逻辑
作用和CG内置函数一样,可以提升我们的Shader开发效率,可以直接使用其中的方法等内容来进行逻辑开发
Unity中常用的内置文件有
UnityCG.cginc:包含最常用的帮助函数、宏和结构体等
...