1.Post Processing Stack
-
安装
在Package Manager里找到 Post Processing
-
使用
- 在相机所在的物体上,添加组件Post-process Layer,将其Layer属性改为PostProcessing
- 右键创建物体3D Object - Post-process Volume,将该物体的Layer改为PostProcessing
- 在Assets中创建Post-process Profile,为Volume的Profile属性赋值
-
设置is Global属性,true代表这些效果总是被绘制在物体上;flase代表效果只在距离volume一定距离内可见
-
效果
- Grain颗粒感,画面叠加颗粒效果
- Vignette渐晕,画面边缘的渐变颜色
- Depth Of Field景深,焦点处清晰,近处和远处模糊
- bloom泛光,有光的区域沿着边缘发光
- Color Grading颜色分级,改变环境颜色
- Ambient Occlusion环境光遮蔽,计算应该具有额外阴影的区域
2.First Shader
-
shader结构
-
名称 Shader "…/name”
-
Properties块,用于在Unity材质的Inspector面板中公开GUI元素,便于修改
格式 : 变量名 ( “描述”, 变量类型 ) = 默认值
-
SubShader块,要想使用上面的值,需要创建与Properties中属性的变量名相同的变量,二者将自动建立连接,之后这些变量可以在函数中使用
-
-
当Shader代码有错误时,不会影响游戏运行,但是材质会被渲染成无阴影的洋红色
3.Surface Shaders and Texture Mapping
-
Unity主要输出结构
- SurfaceOutput -Albedo -Normal -Emission -Alpha -Specular -Gloss
- SurfaceOutputStandard -Albedo -Normal -Emission -Alpha -Occlusion -Smoothness -Metallic
- SurfaceOutputStandardSpecular -Albedo -Normal -Emission -Alpha -Occlusion -Smoothness -Specular
-
packed arrays
-
类型加数字:fixed4 float4x4
-
swizzling:允许在一行内重新寻址数组
_Color.rgb; _Color.bgr; _Color.rg
-
smearing:值被赋给packed array,被复制到所有字段
o.Albedo=1 ==> o.Albedo=(1,1,1)
-
masking:swizzling允许在表达式左边,只给部分字段赋值
o.Albedo.rg=o.Albedo.gr
-
使用_mrc运算符可以访问矩阵元素,还可以是链式的(常规做法方括号matrix[index])
float2 f2 = matrix._m00_m11
-
rgba和xyzw不能混用
-
-
adding a texture to a shader
- 名称uv_MainTex 将识别成关联_MainTex并自动初始化
- texture导入属性设置,Filter mode:Bilinear双线性插值 Pointer移除任何插值;Aniso level:对于地板天花板等从一个陡角观察的纹理,需要增大aniso level
- 使用tex2D(tex,IN.uv_tex)返回该位置的颜色
-
内置变量_Time:提供一个递增的浮点值
-
内置函数UnpackNormal(tex2D(tex,IN.uv_tex))返回法向量,与tex2D区别:法向量范围是(-1,1),颜色值范围在(0,1)
-
透明着色器
-
在Tags块中设置:
“Queue” = “Transparent"//渲染队列 Background=>Geometry=>AlphaTest=>Transparent=>Overlay
“IgnoreProjector” = “True”//不使用Unity的投影
“RenderType” = “Transparent”
-
在LOD下面添加:
Cull Back //不显示模型背面
-
CGPROGRAM下添加:
#pragma surface surf Strandard alpha:fade
告诉shader,此材质的像素需要与先前绘制在屏幕上的其它东西混合
-
-
模型的轮廓:法线方向与视角方向正交的三角形
dot(normal,viewDir) = 0
-
打包和混合原理
- 使用lerp(_ColorA, _ColorB, blendData)对两个颜色进行混合
- 可以用一张图片的rgba通道作为blendData,来混合五个颜色
-
float3 worldPos;//世界位置
float3 viewDir;//观察方向
-
distance(float3,float3)取两点距离