1、
最简单的顶点/片元着色器,组成结构
Unity内置的Unity Shader文件,提供的文件、内置变量和函数等
Unity Shader中使用的Cg语义
如何对Unity Shader进行调试
平台差异对Unity Shader的影响
编写Unity Shader的优化技巧
2、一个最简单的顶点/片元着色器
shader "name"{
Properties{
//属性
}
SubShader{
//针对显卡A的SubShader
Pass{
//设置渲染状态和标签
// 开始Cg代码片段
CGPROGRAM
//该代码片段的编译指令,例如:
#pragma vertex vert
#pragma fragment frag
//Cg代码写在这里
ENDCG
//其他设置
}
//其他需要的Pass
}
SubShader{
//针对显卡B的SubShader
}
//上述SubShader都失败后用于回调的Unity Shader
Fallback "VertexLit"
}
最重要的部分是Pass语义,大部分代码写在这个语句块里面
3、Unity提供的内置文件和变量
顶点/片元着色器的复杂之处在于,很多事情都需要我i们亲力亲为,例如我们需要自己转换发现方向,自己处理光照、阴影等。
为了方便开发者的编码过程,Unity提供了很多内置文件,这些文件包含了很多提前定义的函数、变量和宏等。
包含文件,后缀为.cginc,在编写Shader时,可以用#include指令把这些文件包含进来,这样我们可以就可以使用Unity为我们提供的一些非常有用的变量和帮助函数。
下载的内置着色器文件夹中的文件:
CGIncludes:包含了所有的内置包含文件
DefaultResources:包含了一些内置组件或功能所需要的Unity Shader,例如GUI元素使用的Shader
DefaultResourcesExtra:包含了所有Unity中内置的Unity Shader
Editor:目前只包含了一些脚本文件,用于定义Unity5引入的Standard Shader所用的材质面板
CGIncludes中主要的包含文件以及它们的主要用处:
文件名 | 描述 |
UnityCG.cginc | 包含了最常使用的帮助函数、宏和结构体等 |
UnityShaderVariables.cginc | 在编译Unity Shader时,会被自动包含进来。包含了许多内置的全局变量,如UNITY_MATRIX_MVP等 |
Lighting.cginc | 包含了各种内置的光照模型,如果编写的是Surface Shader的话,会自动包含进来 |
HLSLSupport.cginc | 在编译Unity Shader时,会被自动包含进来。声明了很多用于跨平台编译的宏和定义 |
UnityCG.cginc是我们最常接触的一个包含文件,我们将使用很多该文件提供的结构体和函数
UnityCG.cginc中一些常用的结构体:
名称 | 描述 | 包含的变量 |
appdata_base | 可用于顶点着色器的输入 | 顶点位置、顶点法线、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标 |
appdata_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) | 把方向矢量从世界空间变换到模型空间中 |
4、Unity提供的Cg/HLSL语义
从应用阶段传递模型数据给顶点着色器时Unityzhi'支持的常用语义
语义 | 描述 |
POSITION | 模型空间中的顶点位置,通常时float4类型 |
NORMAL | 顶点法线,通常是float3类型 |
TANGENT | 顶点法线,通常是float4类型 |
TEXCOORDn,如TEXCOORD0、TEXCOORD1 | 该顶点的纹理坐标,通常是float2或float4类型 |
COLOR | 顶点颜色,通常是fixed4或float4类型 |
从顶点着色器传递数据给pian片元着色器时Unity使用的常用语义
语义 | 描述 |
SV_POSITION | 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量 |
COLOR0 | 通常用于输出第一组顶点颜色,但不是必需的 |
COLOP1 | 通常用于输出第二组顶点颜色,但不是必需的 |
TEXCOORD0~TEXCOORD7 | 通常用于输出纹理坐标,但不是必需的 |
片元着色器shu'输出时Unity支持的常用语义
语义 | 描述 |
SV_Target | 输出值将会存储到渲染目标中 |
5、调试方法
①使用假彩色图像
②使用Visual Studio——Graphics Debugger
③帧调试器:Window——Frame Debugger