Unity Shader简单介绍

顶点/片元着色器

顶点/片元着色器的结构大体如下:
Unity Shader简单介绍_第1张图片
一个简单的Unity Shader:
Unity Shader简单介绍_第2张图片
其中:

#pragma vertex vert
#pragma fragment frag

它们告诉Unity,哪些函数包含了顶点着色器的代码,哪些函数包含了片元着色器的代码。
通用的编译指令表如下:

#pragma vertex name
#pragma fragment name


这是顶点着色器代码,它是逐顶点执行的。vert函数的输入v包含了这个顶点的位置,这是通过POSITION语义指定的,它返回值是一个float4类型的变量,它是该顶点在裁剪空间中的位置,POSITIONSV_POSITION都是CG/HLSL中的语义,它们是不可省略的,这些语义将告诉系统用户需要哪些输入值,以及用户的输出是什么。而UNITY_MATRIX_MVP矩阵是Unity内置的模型·观察·投影矩阵。
在这里插入图片描述
frag函数没有任何输入。它的输出是一个fixed4类型的变量,并且使用了SV_Target语义进行限定。SV_Target也是HLSL中的一个系统语义,它等同于告诉渲染器,把用户的输出颜色存储到一个渲染目标(render target)中,这里将输出到默认的帧缓存中。片元着色器中的代码很简单,返回了一个表示白色的fixed类型的变量。片元着色器输出的颜色的每个分量范围在[0,1],其中(0,0,0)表示黑色,而(1,1,1)表示白色。

模型数据从哪里来
我们想要得到模型上每一个顶点的纹理坐标和法线方向。使用纹理坐标来访问纹理,使用法线用于计算光照。因此,我们需要为顶点着色器定义一个新的输入参数,这个参数不再是一个简单的数据类型,而是一个结构体。
Unity Shader简单介绍_第3张图片
上面声明的新结构体a2v包含了顶点着色器需要的模型数据。对于顶点着色器的输出,Unity支持的语义有:POSITION,TANGENT,NORMAL,TEXCOORD0,TEXCOORD1,TEXCOORD2,TEXCOORD3,COLOR等。
Unity Shader简单介绍_第4张图片

Unity提供的内置文件和变量

为了方便开发者的编码过程,Unity提供了很多内置文件,这些内置文件包含了很多提前定义的函数、变量和宏等。

内置的包含头文件
包含文件(include file)是类似于C++中头文件的一种文件。在Unity中,它们的文件后缀是.cginc。使用#include指令把这些文件包含进来。
在这里插入图片描述
Unity Shader简单介绍_第5张图片
在Windows上,它们的位置是:Unity的安装路径/Data/CGIncludes。
Unity Shader简单介绍_第6张图片
Unity Shader简单介绍_第7张图片
Unity Shader简单介绍_第8张图片
内置的变量
Unity还提供了用于访问时间、光照、雾效和环境光等目的的变量。这些内置变量大多位于UnityShaderVariables.cginc中,于光照有关的内置变量还会位于Lighting.cginc、AutoLight.cginc等文件中。

Unity提供的CG/HLSL语义

在DirectX10以后,有了一种新的语义类型,就是系统数值语义(system-value semantics)。这些语义是以SV开头的,SV代表的含义就是系统数值(system-value)。这些语义在渲染流水线中有特殊的含义。

Unity支持的语义
Unity Shader简单介绍_第9张图片
Unity Shader简单介绍_第10张图片
在这里插入图片描述

你可能感兴趣的:(Shader)