Unity Shader的学习笔记
第三天 开始Unity Shader的学习之旅之第二天的补充
文章目录
前言
本来打算第二天写完顶点着色器和片元着色器就结束的,但是法线Unity提供的内置文件和变量,以及Unity提供的Cg/HLSL语义还是比较重要的,之后在代码中出现的次数也比较多,因此再花一点时间来对这块的知识进行一个总结.
一、Unity 提供的内置文件和变量
上一节我们讲述了编写一个基本的顶点着色器和片元着色器的过程,顶点/片元着色器的复杂之处在于,很多事情都需要我们亲力亲为,但是Unity给我们提供了很多内置文件,这些文件包含了很多提前定义的函数,变量和宏,我们给出这些文件和变量的概览.
1. 内置的包含文件
包含文件,类似于C++中头文件的一种文件.在Unity中,他们的文件后缀为.cginc.在编写Shader时,我们可以使用#include指令把这些文件包含进来,这样我们就可以使用Unity为我们提供的一些非常有用的变量和帮助函数.
下表为CGIncludes中主要的包含文件以及他们的主要用处.
文件名 | 描述 |
---|---|
UnityCG.cginc | 包含了最常使用的帮助函数,宏和结构体等 |
UnityShaderVariables.cginc | 在编译Unity Shader时,会被自动包含进来.包含了许多内置的全局变量,例如UNITY_MATRIX_MVP等 |
Lighting.cginc | 包含各种内置的光照模型,如果编写的是Surface Shader的话,会被自动包含进来 |
HLSLSupport.cginc | 在编译Unity Shader时,会被自动包含进来,声明了很多用于跨平台编译的宏和定义 |
2. UnityCG.cginc中的常用结构体
UnityCG.cginc是我们最长接触的一个包含文件,在后面的学习中,我们将使用很多该文件提供的结构体和函数,为我们的编写提供方便.
下表给出了一些UnityCG.cginc的常用结构体
名称 | 描述 | 包含的变量 |
---|---|---|
appdata_base | 可用于顶点着色器的输入 | 顶点位置, 顶点法线,第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置,顶点切线, 顶点法线,第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置,顶点切线,顶点法线, 四组(或更多)纹理坐标 |
aoodata_img | 可用于顶点着色器的输入 | 顶点位置, 第一组法线纹理 |
v2f_img | 可用于顶点着色器的输入 | 裁剪空间中的位置,纹理坐标 |
下表给出了一些UnityCG.cginc的常用帮助函数
函数名 | 描述 |
---|---|
float3 WorldSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中,输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向.没有被归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中,输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向.没有被归一化 |
float3 UnityObjectToWorldNormal(float3 norm) | 把法线方向从模型空间转换到世界空间中 |
float3 UnityObjectToWorldDir(float3 dir) | 把方向矢量从模型空间转换到世界空间中 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向矢量从世界空间转换到模型空间中 |
二、Unity 提供的Cg/HLSL语义
在顶点着色器和片元着色器的输入输出变量后还有一个冒号和大写的名称,这些其实就是Cg/HLSL语义,这些语义可以让Shader知道从哪里读取数据,并把数据输出到哪里.
语义实际上就是一个可以赋给Shader输入和输出的字符串.
Unity为了方便对模型数据的传输,对一些语义进行了特殊的含义规定,例如:在顶点着色器的输入结构体a2v用TEXCOORD0来描述texcoord,Unity会识别该语义,并把模型的第一组纹理坐标填充到texcoord.
1. 从应用阶段传递模型数据给顶点着色器时Unity支持的语义
语义 | 描述 |
---|---|
POSITION | 模型空间下的顶点位置,通常是float4类型 |
NORMAL | 顶点法线,通常是float3类型 |
TANGENT | 顶点切线, 通常为float4类型 |
TEXCOORDn | 该顶点的纹理坐标, TEXCOORD0表示第一组纹理坐标,以此类推,通常是float2或者float4 |
COLOR | 顶点颜色,通常是fixed4或者float4 |
2. 从顶点着色器传递数据给片元着色器时Unity支持的语义
语义 | 描述 |
---|---|
SV_POSITION | 裁剪空间的顶点坐标,结构体中必须包含一个用该语义修饰的变量 |
COLOR0 | 通常用于输出第一组顶点颜色,但不是必须的 |
COLOR1 | 通常用于输出第二组顶点颜色,但不是必须的 |
TEXCOORD0 - TEXCOORD7 | 通常用于输出纹理坐标,但不是必需的 |
3. 片元着色器输出时Unity支持的常用语义
语义 | 描述 |
---|---|
SV_Target | 输出值将会存储到渲染目标(render target)中 |
总结
今天就是把第五章我认为重要的东西收个尾,明天开始每天对光照模型进行复习和分析!!!