US3S3L3——设置混合命令
US3S3L3——设置混合命令 混合 在进行渲染状态的混合相关设置中,我们的步骤为: 进行混合操作的设置(非必须,默认为 Add ) 进行混合方式的设置(主要设置混合因子) 常见的混合类型包括:透明度混合、柔性相加、正片叠底、两倍相乘、变暗、变亮、滤色、线性减淡 混合的基本原理 当我们在进行渲染时,当片元通过了深度测试后,会进入到混合流程中。 在混合流程中: 当前片元的颜色被称为 源颜色 颜色缓冲区中的颜色被称为 目标颜色 混合 就是将 源颜色 和 目标颜色 用对应的混合算法进行计算后 输出一个新的颜色 更新到颜色缓冲区中 注意:这些颜色都是 RGBA,包含透明通道A 混合方式 我们之前在学习 SubShader 语法时学过, 在编写Shader时可以通过添加 混合方式 Blend 的渲染状态 来控制 源颜色 和 目标颜色 如何进行混合计算 以正常透明混合为例: 123456Pass{ Tags { "LightMode" = "ForwardBase" } ZWrite...
US3S3L2——设置深度写入和渲染队列
US3S3L2——设置深度写入和渲染队列 Unity Shader 中设置深度写入 深度写入默认是开启的,我们需要通过 渲染状态中的 ZWrite off 指令主动关闭深度写入 当我们把它写在 Pass 渲染通道中时,它只会影响该 Pass 12345Pass{ Tags { "LightMode" = "ForwardBase" } ZWrite off} 若我们把它写在 SubShader 语句块中,它将影响其中的所有 Pass 1234SubShader{ ZWrite off} Unity Shader 中设置渲染队列 我们知道,渲染队列 非常的重要,它会影响最终的渲染效果。 在 Unity Shader 中我们可以通过渲染标签主动的设置物体的渲染顺序 1Tags { "Queue" = "标签值"...
US3S3L1——渲染顺序的重要性
US3S3L1——渲染顺序的重要性 深度测试和深度写入带来的好处 有了深度测试和深度写入发挥作用,让我们不需要关心不透明物体的渲染顺序 以图为例:一个物体 A 挡住了 物体 B 即使底层逻辑中:先渲染 A ,后渲染 B ,我们也不用担心 B 的颜色会把 A 覆盖 因为在进行深度测试时,远处的 B 的深度值无法通过深度测试 因为它的深度会比已经写入深度缓冲中 A 的深度值大 重合处的片元会被丢弃,颜色自然就不会写入,最终重叠处渲染出来的会是 A 的颜色 我们之前写的所有Shader都没有刻意的去设置下列内容: 深度测试(默认小于判断) 深度写入(默认开启) 混合模式(默认不混合) 渲染队列(默认为几何 Geometry 队列) 相关内容 这是因为对于不透明的物体来说,使用默认设置就能够得到正确的渲染效果 但目前我们将要学习的透明相关知识,就需要对他们进行改变 其中,处理透明混合时最重要的改变就是:处理透明混合时,需要关闭深度写入 透明混合需要关闭深度写入的原因 在图形学中,模拟出现实世界的 半透明效果 是通过将多个颜色进行混合计算呈现出来的 举例:...
US3S2L12——高光纹理综合实现
US3S2L12——高光纹理综合实现 高光纹理综合实现 接下来将高光纹理的映射实现融合到之前实现的法线纹理 Shader 内, 这里复用之前实现的 切线空间下的法线纹理 Shader 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192Shader "TeachShader/Lesson51"{ Properties { _MainColor("MainColor", Color) = (1, 1, 1, 1) _MainTex("MainTex", 2D) = ""{} ...
US3S2L11——遮罩纹理基本概念
US3S2L11——遮罩纹理基本概念 纹理图片存储的数据 纹理(图片)中可以存储的数据可以是 颜色(单张纹理) 法线、高度(凹凸纹理) 漫反射光的强度色(渐变纹理) 一张图片中主要存储的就是像素点数据, 常见情况下,一个像素点存储的 RGBA 值通常占据4个字节 每个颜色通道 R(红),G(绿),B(蓝),A(透明度)通常使用1个字节(8位)来表示 RGBA值中的每个通道通常使用 0~255 之间的整数表示 我们完全可以在图片数据中存储非颜色的数据 比如我们之前学习凹凸纹理时,在图片数据中我们实际上存储的是: 法线数据(RGBA中的 RGB 分别存储模型表面点的法线数据的 XYZ 分量,A 一般为1) 高度数据(RGBA中的 RGB 存储的值相同,为模型表面点的高度数据,A 一般为1 ) 而 遮罩纹理...
US3S2L10——渐变纹理综合实现
US3S2L10——渐变纹理综合实现 渐变纹理综合实现 接下来将渐变纹理的映射实现融合到之前实现的法线纹理 Shader 内, 这里复用之前实现的 切线空间下的法线纹理 Shader 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192Shader "TeachShader/Lesson51"{ Properties { _MainColor("MainColor", Color) = (1, 1, 1, 1) _MainTex("MainTex", 2D) = ""{} ...
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 { ...
US3S2L8——渐变纹理基本概念
US3S2L8——渐变纹理基本概念 渐变纹理 通过单张纹理和凹凸纹理相关知识的学习,我们知道图片中存储的数据不仅仅可以是颜色数据,还可以是高度、法线数据。 理论上来说,图片中存储的数据我们可以自定义规则,我们可以往图片中存储任何满足我们需求的数据用于渲染。 而渐变纹理就是用于控制漫反射光照结果的一种存储数据的方式,它的主要作用是让游戏中的对象具有插画卡通风格 下图中的模型就是使用不同渐变纹理呈现出来的效果 渐变纹理的使用可以保证物体的轮廓线相比之前使用的传统漫反射光照更加明显 而且还能提供多种色调的变化,可以让模型更具卡通感 渐变纹理的基本原理 渐变纹理的基本原理就是在计算漫反射时利用 半兰伯特光照模型 公式中后半部分 半兰伯特光照模型公式: Color漫反射光照=Color光源×Color材质的漫反射×((标准化后物体表面法线向量→⋅标准化后光源方向向量→)×0.5+0.5)Color_{漫反射光照} = Color_{光源} \times Color_{材质的漫反射} \times ((\overrightarrow{标准化后物体表面法线向量} \cdot...
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...