关于Unity5.0以后的Surface shader当中,渲染流程很多都是已经定义好了的,我们只需要改变Surface中的结构体就可以,获取UnityCG.cginc中的已经设置好的参数和计算API。
首先我们发现没有pass,为什么没有?
因为Unity已经在Render Path当中已经封装好了,就是说我们在Camera当中选择怎样的Render Path通道,就会有怎样的特定顶点和灯光计算方式。
一般的格式就是如上图截图。但是我们需要注意的是:
#pragma surface surf Standard fullforwardshadows
这样一个语句块定义了片面着色器的入口函数surf、光照模型Standard(具体就是灯光的作用)、雾的作用fullforwardshadows。
概括这个格式:
#pragma surface surfaceFunction LightModel [optionalparams] 我们可以在surface关键字后面定义:顶点、片面、灯光、FinalColor(雾)这些入口函数
因为Unity5.0以后为了简便,尽量让我们少些一些代码,所以灯光的计算已经封装好了。我们只需要改变一些参数和结构体就好。主要的结构体就是,片段着色器中的这个结构体:
我们已经申明了inout SurfaceOutputStandards o 就可以直接获取到已经封装好的结构体SurfaceOutputStandards当中定义好的参数。如上图。常见的inout结构体有:
SurfaceOutput 类型
SurfaceOutputStandard类型(Occlusion遮盖)
SurfaceOutputStandardSpecular类型 含有高光计算以及参数的结构体输入
每种类型参数多少不一样。以上是在unity5.0之后的shader3.0结构和特点。
其实在unity5.0以前的shader3.0,自由化比较高,也是我们接下来要讲解的。
以上部分就是标准的Surface Shader的讲解。
接下来我们要讲的就是Unity5.0之后的自定义灯光渲染
我们需要改变引用#pragma
#pragma surface surf Lambert finalcolor:mycolor vertex:myvert
并且会进行两次渲染
Surf:片段着色器的入口
Vertex:定义顶点着色器的入口函数
Lambert:灯光作用的入口函数(在unityCG中已经有定义,有默认函数入口)
mycolor:通常定义雾效(可以选择去掉,但是其他函数的位置关系不能改变)
SurfaceShader关于Vertex的编写
在Unity中,关于顶点函数的结构体,是unity封装好了的,也就是说我们可以直接进行引用.
也就是说我们在Vertex顶点函数的输入的结构体,我们能在FBX文件上获取的兴趣的方法以及结果已经包含在了UnityCG。cginc里面了,我们直接用已经封装好了的appdata_base、appdata_tan、appdata_full这三个结构体就可以了
appdata_base结构体:position(顶点位置)、normal(法线)、one texture coordinate(一张uv信息)
appdata_tan结构体:position(顶点位置)、tangent(切线)、normal(法线)、one texture coordinate(一张uv信息)
appdata_full结构体:position(顶点位置)、tangent(切线)、normal(法线)、four texture coordinate(四张uv信息)、color(颜色)
同时我们要注意的是在surf函数当我们用的结构体变为了SurfaceOutput
例如:
fixed、half、float其实都表示float类型、只是精度不一样,分别表示12位、16位、32位。
SurfaceShader关于Vertex的编写
在片段着色器编写中我们对于输入的结构体通常有两个来源,其中之一是我们自己定义的,另外一个是Inout SurfaceOutput(如果我们采用Surface自定义灯光渲染,在surf函数当中就用SurfaceOutput结构体),不然Unity就会报错。我们试着做一个纹理uv偏移的2D动画。
Input这个结构体我们需要注意,在这个结构体中的变量,unity是有规定的。
同时,这个变量中关于uv变量的声明也是一个应该注意的点,格式如下:uv_MainTex(uv+_+主纹理)
struct SurfaceOutput
{
fixed3 Albedo;
fixed3 Normal;
fixed3 Emission;
fixed3 Specular;
fixed3 Gloss;
fixed3 Alpha;
}
我们还是用专门的一章节来讲SurfaceShader当中的顶点着色器和片段着色器之间的注意事项。