UnityShader——中级
UnityShader中级复杂光照Unity 渲染路径:Forward Deferred Legacy Vertex Lit Legacy Deferred
标签名
描述
Always
不管使用哪种渲染路径,该pass总会被渲染,但不会计算任何光照
ForwardBase
用于前向渲染。该pass会计算环境光,最重要的平行光,逐顶点/SH光源和Lightmaps
ForwardAdd
用于前向渲染。该pass会计算额外的逐像素光源,每个pass对应一个光源。
Deferred
用于延迟渲染。该pass会渲染G缓冲(G-buffer)
ShadowCaster
把物体的深度信息渲染到阴影映射纹理或一张深度纹理中
PrepassBase
用于遗留的延迟渲染。该pass会渲染法线和高光反射的指数部分。
PrepassFinal
用于遗留的延迟渲染。该pass会通过合并纹理,光照和自发光来渲染得到最后颜色
Vertex, VertexLMRGBM和VertexLM
用于遗留的顶点照明渲染
在Shader对光照渲染模式进行设置12// ...
UnityShader入门——卡通效果实现
Unity卡通着色Shader实现另外一篇已经被实现的边缘着色Unity——Shader实现边缘发光效果 | mao的博客 (mao1mao2mao3mao4.github.io)
法线外拓的三种方式 来自文心一言的回答要将模型空间下的法线转换到视角空间下,你需要使用模型到视图矩阵(UNITY_MATRIX_MV),但需要注意法线变换的特殊性。法线变换需要使用逆转置矩阵(Inverse Transpose Matrix)来保持其垂直性。Unity提供了一个宏UNITY_MATRIX_IT_MV(尽管你之前的代码中名称有误,但这里是为了说明正确的使用方式),它实际上已经包含了模型到视图矩阵的逆转置。
1.模型空间下
2.视角空间下
3.裁剪空间下
基础阴影实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868 ...
Unity —— Shader入门,纹理应用和透明效果
UnityShader入门——纹理应用和透明效果渐变纹理最简单的,用一张贴图去实现,给出的贴图应该是渐变的色块
123float halfLambert = dot(i.worldNormal,lightDir)* 0.5 + 0.5;//漫反射float3 diffue = _LightColor0.rgb * _Diffse.rgb * tex2D(_RampTex,float2(halfLambert,halfLambert));
渐变纹理按照半兰伯特光照的颜色排序,在 x 轴上渐变
遮罩纹理对blinn phong高光使用该效果,可以控制高光颜色强度
局部着色器实现
123456float3 halfPhongMask = tex2D(_SpecularMask,i.uvMask).r * _SpecularMaskStrength;//提取遮罩贴图并 和强度进行相关 //高光反射 //float3 halfView = normalize(_WorldSpaceCameraPos + _WorldSpaceLightPos0); float3 halfView = ...
Unity —— Shader入门,法线贴图
UnityShader入门——法线贴图高度映射,模型空间下的法线映射,切线空间下的法线映射
贴图纹理和法线之间的转换
知识:向量的分量就是 向量的点表示图中,按照逗号进行分割数字
高度映射使用像素的灰度值来表示该位置的深度
缺点是需要通过一系列的计算来变换为可以使用的法线角度、不利于美术的处理
模型空间下的法线映射坐标系的原点是模型坐标系的原点
颜色很多,每个点的向量都有可能不同,最后呈现的结果就是花里胡哨的。
UV点和模型的每一个顶点都是一一对应的,不方便移动改变,有些高级的特效或者粒子特效需要移动UV贴图来实现。
制作简单
一般在3S贴图中可能遇见
优点
实现简单,更加直观。计算量少。在纹理的边角部分,缝隙较少,可提供平滑的边界。是因为所有法线都是在同一坐标空间中,可以在边角处通过插值进行平滑变换。
切线空间下的法线映射
叉乘:
向量叉乘是对两个三维空间中的向量进行的一种二元运算,其结果是一个新的向量,这个向量垂直于由原始两个向量所定义的平面。
对于两个三维向量a(x1, y1, z1)和b(x2, y2, z2),它们的叉乘c = a × b可以表示为:
c & ...
Unity —— Shader,常用函数
常用函数函数 功能描述
abs(x) 返回输入参数的绝对值
acos(x) 反余切函数,输入参数范围为[-1,1], 返回[0,π]区间的角度值
all(x) 如果输入参数均不为0,则返回ture; 否则返回flase。&&运算
any(x) 输入参数只要有其中一个不为0,则返回true。
asin(x) 反正弦函数,输入参数取值区间为,返回角度值范围为,
atan(x) 反正切函数,返回角度值范围为
atan2(y,x) 计算y/x的反正切值。实际上和atan(x)函数功能完全一样,至少输入参数不同。atan(x) = atan2(x, float(1))。
ceil(x) 对输入参数向上取整。例如: ceil(float(1.3)) ,其返回值为2.0
clamp(x,a,b) 如果x值小于a,则返回a;
如果x值大于b,返回b;否则,返回x。
cos(x) 返回弧度x的余弦值。返回值范围为
cosh(x) 双曲余弦(hyperbolic cosine)函数,计算x的双曲余弦值。
cross(A,B) 返回两个三元向量的叉积(cross pro ...
Unity —— Shader入门,光照
UnityShader入门——光照提示所有的Shader效果图应该以Game窗口为准,Scene窗口很容易出现问题
光照概述
技术点:BRDF光照模型:次时代渲染 ,SSS材质:和次表面相关
标准光照模型自发光,高光反射,漫反射,环境光
自发光物体在摄像机里看起来更亮,在Unity的常规使用中,不对周五其他物体产生影响
高光反射差异blinn——phong的 实现效果比较好
Phong模型推导过程
高光反射公式
1高光反射颜色 = 入射颜色 * 高光颜色 * max(0,(2(n * l)n - l)v)^光泽度
字母代表向量
实现知识:Unity的Reflect()方法可以计算入射光线的反射角度,但是使用的是常规物理画图的表达方式,入射光线方向朝着镜面,而Unity的光源方向和这个相反,因此要取一个 负值
注意:在之前的计算中,错误的使用了,该方法实际上返回的是一个向量,而在phong的计算过程中,需要用到的是点
123456// Transforms direction from object to world spaceinline float3 UnityObject ...
Unity —— UnityShader介绍
UnityShader介绍UnityShader种类
Unity Surface Shader,Unity将顶点和片元Shader进行一个封装
Unlit Shader,标准的顶点和片元Shader
Image Effect Shader,图片特效Shader
Compute Shader,暂时用不到
Shader Variant Collection,Shader库文件
UnityShader和传统Shader的不同
UnityShader属性块Properties:相当于编程语言中属性的定义,这里只是有一个比喻
SubShader
Properties下图是Properties中可以使用的参数以及在Unity可视化操作的窗口样子
下图是上图中的效果在Shader中的代码
最后两个参数其实并不常用,cude是一个天空盒,3D是3D贴图
SubShaderProperties中的属性要在该属性块中使用,属性名需要相同,比如:_MainTex,其次也可以通过C#语言来获取到Shader后再去传递值
Unity会在Shader找到并运行第一个能在发布平台运行的SubShader,如果 ...
Unity —— Shader基础
UnityShader基础最简单的Shader设置模型的颜色为白色
输入结构体
按照给定的名字进行使用,Unity会自动为结构体填充内容,texcoord使用 0 ,是大家公认的第一套UV;
对结构体名字的解释
a:application,即从渲染流中通过Unity自动添加的
2:即 to 的谐音,
v:vertex,代表顶点着色器
最后意思是从程序中输入到顶点着色器中的结构体
输出结构体
属性控制12345_Color("Color",Color)=(1,1,1,1) //在属性块中的属性 fixed4 _Color;//要想在SubShader中使用以上属性就需要在CGPROGRAM按照当前格式定义,名字必须相同//对于 _Color在着色器中的访问,可以使用xyzw或者rgba,来抽取当中的色彩块
库自带输入输出结构体在UnityCG.cginc库文件中,有官方已经实现的输入结构和部分输出结构,使用的时候使用C++的头文件导入形式
1#include "UnityCg.cginc"
1234567891011stru ...
Unity —— 渲染知识入门
图形接口Opengl和DirectX
UnityShader所使用的是CG语言,CG语言在OpenGl和DirectX之上
渲染流水普遍的渲染管线的流程:
下图是基本描述
应用阶段:1.把数据加载到显存中2,设置渲染状态3,调用DrawCall
把数据加载到内存中做的事情数据会从硬盘到内存再到显存,一般加载到显存中的数据都会被从内存中移除
设置渲染状态做的事情这些状态定义了场景中的网格是如何被渲染的,例如,使用哪个定点着色器,片元着色器,光照,材质等
调用DrawCallDrawcall是一个命令,CPU发起,GPU接收,不包含任何材质信息,仅仅指向需要被渲染的图源列表(Unity中存在的DrawCall优化,GPUInstance,这里仅仅是发音比较像,剩余的需要自己去查找)
几何阶段和光栅化阶段两个阶段能被开发者使用代码控制的不多,具体可见ppt中对应的内容
几何阶段定点着色器,曲面细分着色器,几何着色器,裁剪,屏幕映射
顶点着色器处理单位是定点,每个定点都会调用一次定点着色器
空间转换模型空间-》齐次裁剪空间-》计算顶点颜色o.vertex = mul(UNI ...
Unity——Shader实现边缘发光效果
边缘发光效果前置知识点引入模型后需要将模型从自身坐标系先转换到世界坐标系下,然后再转化到摄像机坐标,
UnityObjectToClipPos,将模型的点从自身的坐标系变换到摄像机坐标系的裁剪空间下
渲染管线传递给shader的参数提示,
normal是法线
实现边缘发光效果,前面—》篮球 —》背面黄色:(1)我们的边缘的黄色怎么来的,是把这个球绘制了2次; —>pass 绘制黄色(2)我就面对摄像机的这些面,有重新涂成了黄色;(3)配置我们的渲染队列,修改我们的alpha;(4)发光效果,是不是中间强,边缘弱;找个数学方式,能够做到中间强边缘弱?(5)shader 常用技巧(解题技巧5)
工作原理,在将模型的面投影到2D平面之前,会经历一步裁剪操作,默认将背朝摄像机的面裁剪掉,可以使用Cul Fron关键字将背面的模型也给渲染出来,同时适当增大vertex
具体原理解释
Unity用Shader实现边缘光效果_unity3d shader 边缘光-CSDN博客
对于一些规则的模型,当然可以使用数学计算来获取边缘,但是对于人形就不适用了,为了通用就用这个
在边缘光的设置上, ...