一、在学习shader入门精要过程中我用的unity2018.4版本
1、Unity常用包含文件
文件名 | 描述 |
UnityCG.cginc | 包含了常用的帮助函数、宏和结构体 |
UnityShaderVariables.cginc | 在编译UnityShader时,会被自动包含进去,包含了许多内置的全局变量,如:UNITY_MATRIX_MVP等 |
Lighting.cginc | 包含了各种内置的光照模型,如果编写的的是SurfaceShader的话,会自动包含进去 |
HLSLSupport.cginc | 在编译UnityShader时,会自动包含进来,声明了很多用于跨平台编译的宏和定义 |
2、UnityCG.cginc中一些常用的结构体
名称 | 描述 | 包含的变量 |
appdata_base | 可用于顶点着色器的输入 | 顶点位置、顶点法线、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标 |
appdata_img | 可用于顶点着色器的输入 | 顶点位置、第一组纹理坐标 |
v2f_img | 可用于顶点着色器的输出 | 裁切空间中的位置、纹理坐标 |
3、Unity.cginc中一些常用的帮助函数
float3 WorldSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回世界空间中的从该点到摄像机的观察方向 |
float3 UnityWorldSpaceViewDir(float4 v) | 输入一个世界空间中的顶点位置,返回世界空间中的从该点到摄像机的观察方向 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回模型空间中的从该点到摄像机的观察方向 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中的从该点到光源的光照方向,没有被归一化。 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个世界空间中的顶点位置,返回世界空间中的从该点到光源的光照方向,没有被归一化。 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中的从该点到光源的光照方向,没有被归一化。 |
float3 Shade4PointLights(...) | 仅可用于前向渲染中。计算四个点光源的光照,它的参数是已经打包进矢量的光照数据,如unity_4LightPosX0、unity_LightColor等。前向渲染通常会使用这个函数计算逐顶点光照。 |
float3 UnityObjectToWorldNormal(float3 norm) | 把法线方向从模型空间转换到世界空间中 |
float3 UnityObjectToWorldDir(in float3 dir) | 把方向矢量从模型空间变换到世界空间中 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向矢量从世界空间变换到模型空间中 |
4、从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义
语义 | 描述 |
POSITION | 模型空间中的顶点位置,通常是float4类型 |
NORMAL | 顶点法线,通常是float3类型 |
TANGENT | 顶点切线,通常是float4类型 |
TEXCOORDn,如:TEXCOORD0、TEXCOORD1 | 该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标 |
COLOR | 顶点颜色,通常是fixed4或者float4类型 |
5、从顶点着色器传递数据给片元着色器时Unity使用的常用语义
语义 | 描述 |
SV_POSITION | 裁切空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量 |
COLOR0 | 通常用于输出第一组顶点颜色,但不是必须的 |
COLOR1 | 通常用于输出第二组顶点颜色,但不是必须的 |
TEXCOORD0~TEXCOORD7 | 通常用于输出纹理坐标,但不是必须的 |
6、片元着色器输出时Unity支持的常用语义
语义 | 描述 |
SV_Target | 输出值将会存储到渲染目标中。 |
7、CG提供帮助函数
样式 | 函数 | 参数 | 返回值 |
saturate(x) | 把x截取在[0,1]范围内,如果x是一个矢量,那么会对它的每个分量进行这样的操作 | x:为用于操作的标量或者矢量 | [0,1]范围 |
reflect(i,n) | 计算反射方向 | i:入射方向;n:法线方向 | 反射方向 |
tex2D(m,v) | 对纹理进行采样 | m:需要被采样的纹理,v:float2类型的纹理坐标 | 得到的纹素值 |
clip(float4 x) clip(float3 x) clip(float2 x) clip(float1 x) clip(float x) | 透明度测试(如果给定的参数任何一个分量是负数,就会舍弃当前像素的输出颜色) | 裁切时使用的标量或者矢量条件 | |
cross(A,B) | 返回两个三元向量的叉积(cross product)。注意,输入参数必须是三元向量 | ||
floor(f) | 返回小于等于参数的最大整数值 | ||
frac(f) | 取小数部分 |
8、前向渲染可以使用的内置光照变量
名称 | 类型 | 描述 |
LightColor0 | float4 | 访问该Pass处理的光源的颜色和强度信息(想要得到正确的值需要定义合适的LightMode标签) |
_WorldSpaceLightPos0 | float4 | _WorldSpaceLightPos0.xyz是该Pass处理的逐像素光源的位置。如果该光源是平行光,那么_WorldSpaceLightPos0.w是0,其他光源类型w值为1. |
_LightMatrix0 | float4x4 | 从世界空间到光源空间的变换矩阵。可以采用cookie和光强衰减(attenuation)纹理 |
unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0 | float4 | 仅用于BasePass。前4个非重要的点光源在世界空间中的位置 |
unity_4LightAtten0 | float4 | 仅用于BasePass。存储了前4个非重要的点光源的衰减因子 |
unity_LightColor | half[4] | 仅用于BasePass。存储了前4个非重要的点光源的颜色 |
9、unity内置的时间变量
名称 | 类型 | 描述 |
_Time | float4 | t是自该场景加载开始所经过的时间,4个分量的值分别是(t/20,t,2t,3t) |
_SinTime | float4 | t是时间的正弦值,4个分量的值分别是(t/8,t/4,t/2,t) |
_CosTime | float4 | t是时间的余弦值,4个分量的值分别是(t/8,t/4,t/2,t) |
unity_DeltaTime | float4 | dt是时间增量,4个分量的值分别是(dt,1/dt,smoothDt,1/smoothDt) |