Unity中的计算机图形学(八)----SurfaceShader以及Unity5.0版本之后的自定义灯光渲染

关于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当中的顶点着色器和片段着色器之间的注意事项。

猜你喜欢

转载自blog.csdn.net/qq_38651460/article/details/80994058