欢迎来到文KRIFE齐的博客!
欢迎你来到文KRIFE齐的博客!目前这个博客还在建设中!还比较简陋,如有问题还请多多包涵~
关于这个博客的内容
这个博客主要是展示笔者之前学习过的知识,主要是Unity相关的内容,以后会增加一些别的内容。
这个博客里的所有的字严格来说并不是笔者手敲的,笔者的博客(或者说笔者的学习笔记)是将笔者学过的不同课程的知识点,归纳总结到笔者的学习笔记内,以方便笔者翻阅查找,降低复习成本,将学习中遇到的问题标记出来,这个博客内的代码都是笔者自己手敲过一遍的并运行过确认结果无误的。
这个博客根据笔者的学习进度,不定时的更新。
关于这个博客的生成方式以及目前存在的问题
这个博客目前还只是用于展示笔者使用思源记录的笔记,故这里的文章都是从思源笔记导出为md文件,然后经过一定加工展示出来的。
由于思源笔记准确来说并不是一个markdown的编辑器(只是使用markdown语法),因此从思源笔记导出来的md文件会不可避免的丢失一些内容,例如:双链引用,超级块排版,颜色标注等等,这导致一些适用于思源笔记的内容排布在博客上会有水土不服的问题。
笔者尽力保证的笔记的公式显示正常,以及图片显示正常
如果你愿意或者正 ...
US3S2L12——高光纹理综合实现
US3S2L12——高光纹理综合实现
高光纹理综合实现
接下来将高光纹理的映射实现融合到之前实现的法线纹理 Shader 内,
这里复用之前实现的 切线空间下的法线纹理 Shader
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192Shader "TeachShader/Lesson51"{ Properties { _MainColor("MainColor", Color) = (1, 1, 1, 1) _MainTex("MainTex", 2D) = ""{} _BumpMap("BumpMap&qu ...
US3S2L11——遮罩纹理基本概念
US3S2L11——遮罩纹理基本概念
纹理图片存储的数据
纹理(图片)中可以存储的数据可以是
颜色(单张纹理)
法线、高度(凹凸纹理)
漫反射光的强度色(渐变纹理)
一张图片中主要存储的就是像素点数据,
常见情况下,一个像素点存储的 RGBA 值通常占据4个字节
每个颜色通道 R(红),G(绿),B(蓝),A(透明度)通常使用1个字节(8位)来表示
RGBA值中的每个通道通常使用 0~255 之间的整数表示
我们完全可以在图片数据中存储非颜色的数据
比如我们之前学习凹凸纹理时,在图片数据中我们实际上存储的是:
法线数据(RGBA中的 RGB 分别存储模型表面点的法线数据的 XYZ 分量,A 一般为1)
高度数据(RGBA中的 RGB 存储的值相同,为模型表面点的高度数据,A 一般为1 )
而 遮罩纹理 本质上就是在图片中的RGBA内存储各种数据,用于参与渲染相关的计算,从而达到我们的目标效果
遮罩纹理
遮罩纹理通常用于控制或限制某些效果的显示范围。它允许我们可以保护某些区域,使它们免于某些修改。
一般情况下,遮罩纹理也会是一张灰度图,其中的RGB值会是相同的
我们利用它存储的值 ...
US3S2L10——渐变纹理综合实现
US3S2L10——渐变纹理综合实现
渐变纹理综合实现
接下来将渐变纹理的映射实现融合到之前实现的法线纹理 Shader 内,
这里复用之前实现的 切线空间下的法线纹理 Shader
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192Shader "TeachShader/Lesson51"{ Properties { _MainColor("MainColor", Color) = (1, 1, 1, 1) _MainTex("MainTex", 2D) = ""{} _BumpMap("BumpMap&qu ...
US3S2L9——渐变纹理基础实现
US3S2L9——渐变纹理基础实现
渐变纹理基础Shader实现
Shader 属性相关
漫反射颜色
渐变纹理
高光反射颜色
光泽度
1234567Properties{ _MainColor("MainColor", Color) = (1, 1, 1, 1) _RampTex("RampTex", 2D) = ""{} _SpecularColor("SpecularColor", Color) = (1, 1, 1, 1) _SpecularNum("SpecularNum", Range(8, 256)) = 18;}
结构体相关
顶点着色器中传入:
可以使用 UnityCG.cginc 中的 appdata_base,其中包含了我们需要的顶点、法线相关数据
1234567// UnityCG.cginc内定义,无需自己再定义struct appdata_base { float4 ve ...
US3S2L8——渐变纹理基本概念
US3S2L8——渐变纹理基本概念
渐变纹理
通过单张纹理和凹凸纹理相关知识的学习,我们知道图片中存储的数据不仅仅可以是颜色数据,还可以是高度、法线数据。
理论上来说,图片中存储的数据我们可以自定义规则,我们可以往图片中存储任何满足我们需求的数据用于渲染。
而渐变纹理就是用于控制漫反射光照结果的一种存储数据的方式,它的主要作用是让游戏中的对象具有插画卡通风格
下图中的模型就是使用不同渐变纹理呈现出来的效果
渐变纹理的使用可以保证物体的轮廓线相比之前使用的传统漫反射光照更加明显
而且还能提供多种色调的变化,可以让模型更具卡通感
渐变纹理的基本原理
渐变纹理的基本原理就是在计算漫反射时利用 半兰伯特光照模型 公式中后半部分
半兰伯特光照模型公式:
Color漫反射光照=Color光源×Color材质的漫反射×((标准化后物体表面法线向量→⋅标准化后光源方向向量→)×0.5+0.5)Color_{漫反射光照} = Color_{光源} \times Color_{材质的漫反射} \times ((\overrightarrow{标准化后物体表面法线向量} \cdot \overrig ...
US3S2L7——世界空间下计算法线纹理贴图
US3S2L7——世界空间下计算法线纹理贴图
关键知识点补充
模型空间下的切线数据
模型数据中的切线数据为 float4 类型的(四维向量),其中的 w 表示副切线的方向
用法线和切线叉乘得到的副切线方向可能有两个(如下图的两个方向的灰色线),用切线数据中的 w 与之相乘确定副切线方向
Unity 当中的法线纹理类型
当我们把纹理类型设置为 Normal map(法线贴图)时,
我们可以使用Unity提供的内置函数 UnpackNormal 来得到正确的法线方向。
该函数内部不仅可以进行 法线分量=像素分量×2−1法线分量 = 像素分量 \times 2 - 1法线分量=像素分量×2−1的逆运算,
还会进行解压运算(Unity 会根据不同平台对法线纹理进行压缩)
法线纹理属性命名一般为 _BumpMap(凸块贴图),
并声明一个我们还会声明一个名为 _BumpScale(凸块缩放))的 float 属性,它主要用于控制凹凸程度
当它为 0 时,表示没有法线效果,法线的影响会被消除
当它为 1 时,表示使用法线贴图中的原始法线信息,没有缩放
我们可 ...
US3S2L6——切线空间下计算法线纹理贴图
US3S2L6——切线空间下计算法线纹理贴图
导入法线贴图资源
对于法线贴图,它的纹理类型需要设置为 Normal Map
关键知识点补充
模型空间下的切线数据
模型数据中的切线数据为 float4 类型的(四维向量),其中的 w 表示副切线的方向
用法线和切线叉乘得到的副切线方向可能有两个(如下图的两个方向的灰色线),用切线数据中的 w 与之相乘确定副切线方向
Unity 当中的法线纹理类型
当我们把纹理类型设置为 Normal map(法线贴图)时,
我们可以使用Unity提供的内置函数 UnpackNormal 来得到正确的法线方向。
该函数内部不仅可以进行 法线分量=像素分量×2−1法线分量 = 像素分量 \times 2 - 1法线分量=像素分量×2−1的逆运算,
还会进行解压运算(Unity 会根据不同平台对法线纹理进行压缩)
法线纹理属性命名一般为 _BumpMap(凸块贴图),
并声明一个我们还会声明一个名为 _BumpScale(凸块缩放))的 float 属性,它主要用于控制凹凸程度
当它为 0 时,表示没有法线效果,法 ...
US3S2L5——法线贴图的计算方式
US3S2L5——法线贴图的计算方式
回顾知识:
转置矩阵:将原始矩阵的行和列互换得到的新矩阵,假设矩阵为 MMM ,那 MMM 的转置矩阵一般写为 MTM^TMT
正交矩阵:一个方阵和它的转置矩阵相乘为单位矩阵,就是正交矩阵:MMT=MTM=IMM^T = M^TM = IMMT=MTM=I,正交矩阵的逆矩阵就是其转置矩阵
基础变换矩阵的构成规则:
一个能表示旋转缩放,平移的 4×44 \times 44×4 矩阵的基本构成规则为:
[M11M12M13txM21M22M23tyM31M32M23tz0001]\begin{bmatrix}
M_{11} & M_{12} & M_{13} & tx \\
M_{21} & M_{22} & M_{23} & ty \\
M_{31} & M_{32} & M_{23} & tz \\
0 & 0 & 0 & 1
\end{bmatrix}
M11M21M310M12M22M320M13M2 ...
US3S2L4——凹凸纹理基本概念
US3S2L4——凹凸纹理基本概念
纹理知识回顾
单张纹理是模型的“皮”,它决定了模型的颜色表现,
在建模时通过纹理隐射技术将顶点和纹理图片建立联系,在模型数据中记录顶点对应的UV坐标,
进行Shader开发时,利用UV坐标即可从纹理图片中取出对应位置的颜色给片元“上色”
凹凸纹理
纹理 除了可以用来进行 颜色映射 外,另外一种常见的应用就是进行 凹凸映射
凹凸映射的目的是使用一张纹理来修改模型表面的法线,让我们不需要增加顶点,而让模型看起来有凹凸效果。
原理:光照的计算都会利用法线参与计算,决定最终的颜色表现效果。
那么在 计算 “假” 凹凸面时,使用“真”凹凸面的法线 参与计算,呈现出来的效果可以以假乱真
左图是真实凹凸表面的光线,右图是不使用真凹凸表面的光线,
想要在非凹凸面上体现凹凸感,就需要通过法线改变光线方向,通过光照模拟出凹凸感
凹凸纹理最大的作用就是让模型可以 在不添加顶点(不增加面)的情况下
让模型看起来同样充满细节(凹凸感),是一种视觉上的“欺骗”技术
下图就是在凹凸纹理的运用,通过一张凹凸纹理改变光照效果,让模型的表面看起来凹凸不平
要进行凹凸映射 ...