备注:本文章为学习笔记,讲解内容为蛮牛-守望整理、所有。
Part A
1.渲染管线流程细分:
顶点处理
面处理
光栅化
像素处理
顶点处理:
1.顶点变化:将每个物体位置转换为世界坐标。
2.观察坐标系-投影坐标系:将每个物体从世界坐标投影到观察者的投影平面上。
面处理:
1.面的组装
2.面的剔除:物体间遮挡,看不到的部分就不用计算了。
3.面的截取:摄像机(眼睛)看到的范围为一个椎体,看不到的周边做一个截取。
光栅化:将以向量为基本的面转换成一个个点阵形式的像素集合。屏幕输出的时候是以像
素输出。
像素处理:将以向量为基本的面转换为一个个点阵形式的像素集合。
对每个像素区域进行着色
对像素贴上贴图
最终形成2d画面
shader三种数据类型,fixed在某些显卡中可能不被很好的支持。
materials材质面板对应结果
Part B
1.简介
Unity中所有的渲染都使用着色器完成
1.顶点和片段着色器:功能最强大、最自由的形态,特征是在Pass里面出现CGPROGRAM和ENDCG块。
2.表面着色器:推荐的照射器,相对简单强大,有光照和阴影的影响。如果未对光线进行任何处理,请勿使用表面着色器。
3.固定功能着色器:适用于陈旧、古老的硬件。
固定功能
着色器
顶点和片段着色器
表面着色器
可以在Shader中写多个SubShader,但是其后每个SubShader中必须写Pass{},写多个SubShader可以解决兼容性问题,第一个SubShader不行就执行后面一个SubShader。如果所有的SubShader都不满足要求 时则使用Fallback "Diffuse"会退到另一个Shader。
Pass为渲染通道,一个SubShader中可以有多个Pass,意义为多次渲染,Pass应该尽量的少。
表面着色器中没有Pass,其会被编译一次,在编译的过程中会加上Pass,如果手动加会报错。
LOD,其值的设定有主的适配各种机型,进行各种处理。
2.剔除和深度测试(Cull,ZWrite,ZTest)
深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区;
深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区;
深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区;
深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区。
1.cull off为正反面都绘制
2.cull back不渲染背面
(cull back的材质赋给平面)
平面的背面没有被绘制
3.cull front不渲染正面(材质赋值给平面)
zwrite
默认状态下,深度缓存开启,前面的物体会遮住后面的物体。
zwrite off后,两者都可以被看到
ztest(例子中shader赋给材质,材质赋给当前选中的物体)
ztest less
ztest greater
3.tag标签,用键值对的方法书写,之间用空格隔开
tag分为四类,Queue渲染序列,Render Type渲染类型,ForceNoShadowCasting表示接不接受阴影(为true时),IgnoreProjector表示不接受Projector组件的投影(为true时)。
Render Type
Opaque 不透明,最常用的一种
Transparent 绝大部分透明的物体,包括粒子特效都使用这个
Background 天空盒使用的这个
Overlay GUI 镜头光晕使用这个
Queue(注意,取消深度缓冲后后渲染的物体会把先渲染的东西遮住)
值越小越先绘制。
Background值为1000,比如天空盒
Geometry最为常用,用作不透明物体,值为2000
AlphaTest值为2450
Transparent值为3000
Overlay值为4000
用户自定义任意值,比如"Queue"="Geometry+10"
4.透明测试(AlphaTest),常用于花草树木的绘制。
需要一张带Alpha通道的图片
写一个shader命名为AlphaTest
Direct3D 11可能不支持AlphaTest不能正确显示透明效果,BuildingSetting中的Player Setting中Direct3D 11不要勾选。
我们写的是alpha Greater,是指的仅仅渲染大于AlphaValue的像素。随着alpha值的变化,观察图片中的变化。
5.混合(Blending)
one zero
oneone
zero one
bending常用的组合
1.Alpha混合(类似于玻璃的效果,炫):
2.相加:One One
3.柔和相加:OneMinusDSTColor One
4.相乘:DSTColor Zero
5.2倍相乘:DSTColor SrcColor
6.雾(fog)
全局雾的设置:Edit->Render Setting->Fog
每个面每个模型可以设置自己的雾
fog可以写在subshader中,也可以写在pass通道中
远距离观察效果
近
距离观察效果