渲染管线流程图:
1.应用程序阶段
包括输入装配阶段/顶点信息阶段,以及上传对应纹理信息、编译着色器指令和设置相关变量(光源位置、光线种类、摄像机视椎体、模型信息,顶点位置,法线)等。广义的还包括视椎体裁剪、控制器输入、碰撞检测等。(将视椎体外的物体剔除,引擎自动完成,也有相关API提供,或与遮挡剔除共用)。
2.几何阶段
具体包括:坐标变换->顶点着色->投影变换->裁剪->屏幕映射
将模型坐标映射到屏幕坐标(裁剪空间)生成新的图元,备后续完成图像渲染。
期间需要变换到一个合适的坐标系,进行相应的渲染操作,如世界空间下计算顶点法线与光线的相互作用更方便。
3.光栅化阶段
将几何阶段传来的图元光栅化,将它们转化为片元。即转变为一个个像素点用于在屏幕上显示。
逐像素调用片原着色器,涉及一些剔除,隐藏面消除在这里执行。
渲染流水线执行阶段
1.输入装配阶段:负责从CPU获取图元基本信息,组合成流水线需要的几何信息。
渲染批次:
2.顶点着色器:负责处理输入装配阶段传入的数据,主要进行坐标变换,(返回值)将顶点从模型空间转变到裁剪空间,法线转到世界空间,对后续计算需要用到的结构体中的数据进行赋值。或者对顶点做出一些变化。
3.细化阶段(可选);移动平台很少支持
4.几何着色器(可选):可处理不同的图元点,线,三角面,并可处理它们的相邻点。适合以下算法:
点精灵扩展,动态粒子系统,毛皮/晶粒生成,阴影体生成,从单通道渲染到立方体贴图,以图元为单位的材质替换与设置。
即可以实现调整图元,创造图元和删除图元,控制图元之间的关系。
5.流输出阶段:将顶点数据输出到内存或显存中,供输入装配阶段,可编程的着色器阶段使用加载功能读取。U3D中较少使用,通常直接交给光栅化阶段处理,一种应用场景为基于GPU的骨骼蒙皮计算。
6.片元着色器:进行光照处理效果表现,每个像素都会执行应尽量减少其中的计算量避免三角函数,开放等计算。
7.输出合并阶段:颜色缓存,深度缓存,多重采用缓存和模板缓存的信息进行加工处理,以决定最终输出像素是什么。(垂直同步可限制显卡刷新一帧的速度)
延迟渲染/前向渲染/批次合并渲染
通常使用前项渲染(方便使用一些内置光照函数):按照光照类型进行不同光源下的渲染然后合并输出
光照类型,逐像素光,逐顶点光,球谐函数,
可以包含多个Pass块,BasePass中计算主方向光下的渲染情况
AdditionalPass中计算其他影响该物体的次要光源渲染情况(Blend One One 混合)
Shader "Custom/FW"
{
Properties//公开属性
{
//_MainTex ("Texture", 2D) = "white" {}
_Colorcosm("_Colorc",Color) = (1,1,1,1)//属性类型(“属性名字”,属性类型)= 属性值
_Vector("_Vectorc",Vector) = (1,2,3,4)//float4
_Int("_Intc",Int) = 2333 //float
_Float("_Floatc",Float) = 7.5//float
_Range("_Range",Range(1,11)) = 7//范围值
_2D("Texture",2D) = "white"{}//sampler2D
_Cube("Cube",Cube) = "red"{}//samplerCube
_3D("Texture",3D) = "black"{}//sampler3D
}
SubShader//子着色器可以写多个
{
Tage//Sub块标签:键值都为字符型的键值对,控制渲染引擎如何/何时渲染该对象
{
//标签类型
"Queue" = "AlphaTest"//渲染队列,可控制透明物体在所有不透明物体后面渲染
"RanderType" = "Opaque"//着色器分类,不透明/透明。
"DisableBatching" = "True"//如顶点动画,是否使用批量处理
"ForceNoShadowCasting" = "True"//控制该SubShader物体是否投射阴影
"IgnoreProjecttor" = "Flase"//控制该SubShader物体是否受到工程影响,True常用用于半透明物体
"CanUseSprite Atlas" = "False"//该SubShader用于精灵(Sprites)时,将该标签射为“Fales”
"PreviewType" = "Plane"//设置材质面板以何种形式预览该材质,默认为球体,可设置为“Plane”,"Skybox"等
}
//RenderSetup:状态设置
Cull Balk//Front//Off //设置剔除模式
ZTest Always//设置深度测试时使用的函数(与缓存区值进行对比>=</通过测试/不通过测试)
ZWrite On//Off//开启/关闭深度写入
Blend SrcFactor//DstFactor//开启并设置混合模式
Pass//着色器具体绘制方式,同样可以有多个,(尽量写在一个中只提交一次)
{
Tags//标签类型
{
//设置为前项渲染
"LightMode" = "ForwardBase"//定义该Pass在Unity的渲染流水线中的角色,
"RequireOptions" = "SoflVegetation"//指定满足某些条件时渲染该Pass
}
CGPROGRAM//CG语言代码
//在CG语言中国对公开的属性进行声明
fixed4 _Color//颜色0~1可用fixed存储
float4 _Vector
float _Int
float _Float
float _Range
sampler2D _2D
samplerCube _Cube
sampler3D _3D
#pragma vertex vert//声明顶点着色器
#pragme fragment frag//声明片段着色器
//数据类型:float(32位)/half(16万 -60000~+60000)/fixed(11 -2~+2)-不同精度的浮点
//Integer-整型,sampler-2D贴图,sampleCUBE-六面3D贴图
//返回值(坐标) 方法名(参数(坐标):POSITON(语义)):SV_POSOTION(返回值语义)
//顶点函数:将模型坐标从模型空间(建模时原点坐标)转化到剪裁空间(栅格化)
float4 vert(float4 pos:POSITION) :SV_POSITION
{
//通过矩阵将模型空间坐标转化为屏幕剪裁空间下的坐标
//float4 pos = mul(UNITY_MATRIX_MVP,/*UNITY宏*/pos);//4*4矩阵相乘返回转化后的坐标
return UnityObjectToClipPos(pos);
}
float4 frag() :SV_Target//片原函数,片段在屏幕上像素颜色,返回颜色值
{
return float4 (0.5,1,1,1);//返回白色
}
ENDCG
}
}
//CostomEditer ""//材质面板自定义样式的脚本路径
FallBack "Diffuse"//以上SubShader都不支持时执行此路径的Shader,还是不支持时继续找此路径Shader里边的FallBack(都不支持变为粉色)
}