常用文件:
文件路径:{Unity安装路径}/Editor/Data/CGIncludes/
参考资料:http://www.ceeger.com/Components/SL-BuiltinIncludes.html
参考资料:《Unity Shader 入门精要》
文件名 | 描述 |
---|---|
UnityCG.cginc | 最常使用的帮助函数、宏和结构体等 |
UnityShaderVariables.cginc | 编译Shader时会自动包含,文件包含了许多内置的全局变量 |
Lighting,cginc | 包含各种内置光照模型,如果编写的surface shader 会自动包含 |
HLSLSupport.cginc | 编译Shader时会自动包含,声明了很多跨平台的编译宏和定义 |
常用方法、宏、变量:
方法 | 描述 |
---|---|
UnityObjectToClipPos | 文件: UnityShaderUtilities.cginc 格式: float3 UnityObjectToClipPos(in float3 pos) float3 UnityObjectToClipPos(float4 pos) 描述:局部坐标转换位齐次坐标 |
UnityObjectToViewPos | UnityCG.cginc |
UnityObjectToWorldDir | 文件:UnityCG.cginc 格式:float3 UnityObjectToWorldDir(in float3 dir) 描述:把方向矢量从模型空间转换到世界空间中 |
UnityObjectToWorldNormal | 文件:UnityCG.cginc 格式:float3 UnityObjectToWorldNormal(in float3 norm) 描述:将模型空间下的法线转为世界空间下的法线 |
UnityWorldToClipPos | UnityCG.cginc |
UnityWorldToViewPos | UnityCG.cginc |
UnityWorldToObjectDir | 文件:UnityCG.cginc 格式:float3 UnityWorldToObjectDir(float3 dir) 描述:把方向矢量从世界空间变换到模型空间中 |
UnityWorldSpaceLightDir | UnityCG.cginc |
WorldSpaceLightDir | 文件:UnityCG.cginc 格式:float3 WorldSpaceLightDir(float4 v) 描述:输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向(没有归一化,仅可用于向前渲染) |
ObjSpaceLightDir | 文件:UnityCG.cginc 格式:float3 ObjSpaceLightDir(float4 v) 描述:输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向(没有归一化,仅可用于向前渲染) |
UnityWorldSpaceViewDir | UnityCG.cginc |
WorldSpaceViewDir | 文件:UnityCG.cginc 格式:float3 WorldSpaceViewDir(float4 v) 描述:输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向 |
ObjSpaceViewDir | 文件:UnityCG.cginc 格式:float3 ObjSpaceViewDir(float4 v) 描述:输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向 |
UnityViewToClipPos | UnityCG.cginc |
ComputeScreenPos | 文件: UnityCG.cginc 格式: float4 ComputeScreenPos(float4 pos) 描述:输入一个齐次坐标空间的值计算屏幕坐标值 |
ComputeGrabScreenPos | 文件:UnityCG.cginc 格式:float4 ComputeGrabScreenPos(float4 pos) 描述:输入齐次坐标空间的值获取抓取屏幕纹理的坐标值 ,内部主要做两件事:1.处理DX和OpenGL纹理坐标差异 2.将标准裁剪空间(-1,1)区间的顶点转化到(0,1)区间 |
LinearEyeDepth | 文件:UnityCG.cginc 格式:float LinearEyeDepth(float z) 描述:把深度纹理的采样结果转换到视角空间下的深度值 |
Linear01Depth | 文件:UnityCG.cginc 格式:float Linear01Depth(float z) 描述:返回一个范围在[0, 1]的线性深度值 |
UnpackNormal | 文件:UnityCG.cginc 格式:fixed3 UnpackNormal(fixed4 packednormal) 描述:获取法线纹理的正确采样 |
宏 | 描述 |
TRANSFORM_TEX | 文件:UnityCG.cginc 格式:TRANSFORM_TEX(tex,name) 描述:将模型顶点的uv和Tiling、Offset两个变量进行运算,计算出实际显示用的定点uv。如果Tiling 和Offset是默认值(即Tiling为(1,1) Offset为(0,0))可以直接使用o.uv = v.texcoord.xy,也能正常显示 |
COMPUTE_EYEDEPTH | 文件: UnityCG.cginc 格式:COMPUTE_EYEDEPTH(o) 描述:计算顶点在视觉空间的深度,并输出到o中(如果不渲染深度纹理时,请在顶点着色器中使用) |
SAMPLE_DEPTH_TEXTURE_PROJ | 文件:HLSLSupport.cginc 格式:SAMPLE_DEPTH_TEXTURE_PROJ(tex,uv) 描述:深度纹理进行采样,tex:深度纹理,uv:float3或float4纹理坐标,通常为由顶点着色器输出插值而得的屏幕坐标。 例如: SMAPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.srcPos)) i.srcPos 是在顶点着色器中通过调用ComputeScreenPos(o.pos)得到的屏幕坐标 |
UNITY_PROJ_COORD | 文件:HLSLSupport.cginc 格式:UNITY_PROJ_COORD(a) 描述:输入一个四维向量,返回一个适合投影纹理读取的纹理坐标。大多数平台上,这直接返回给定值。 |
TANGENT_SPACE_ROTATION | 文件:UnityCG.cginc 格式: #define TANGENT_SPACE_ROTATION float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w; float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal ) 描述:构造出tangent space的坐标系,定义转换到tangent(在实际使用中,相当于嵌入上两行代码) |
变量 | |
_WorldSpaceCameraPos | 文件:UnityCG.glslinc 定义: uniform vec3 _WorldSpaceCameraPos 描述:当前渲染相机在世界空间下的位置 |
_LightSpaceLightPos0 | 文件:UnityCG.glslinc 定义:uniform vec4 _WorldSpaceLightPos0 描述: |
_Time | 文件:UntiyCG.glslinc 定义:uniform vec4 _Time 描述: |
_SinTime | 文件:UntiyCG.glslinc 定义:uniform vec4 _SinTime 描述: |
_CosTime | 文件:UntiyCG.glslinc 定义:uniform vec4 _CosTime 描述: |
_ProjectionParams | 文件:UntiyCG.glslinc 定义:uniform vec4 _ProjectionParams 描述:x=1.0(或-1.0),y=Near,z = Far,w=1.0+1.0/Far,Near和Far分别为近裁剪平面和远裁剪平面和相机的距离 |
_ScreenParams | 文件:UntiyCG.glslinc 定义:uniform vec4 _ScreenParams 描述:x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height,其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度 |
_LightPositonRange | 文件:UntiyCG.glslinc 定义:uniform vec4 _LightPositonRange 描述: |
unity_ObjectToWorld | 文件:GLSLSupport.glslinc 定义:uniform mat4 unity_ObjectToWorld 描述: |
unity_WorldToObject | 文件:GLSLSupport.glslinc 定义:uniform mat4 unity_WorldToObject 描述: |
unity_MatrixVP | 文件:GLSLSupport.glslinc 定义:uniform mat4 unity_MatrixVP 描述:> |
unity_MatrixV | 文件:GLSLSupport.glslinc 定义:uniform mat4 unity_MatrixV 描述: |
unity_MatrixIntV | 文件:GLSLSupport.glslinc 定义:uniform mat4 unity_MatrixIntV 描述: |
Unity内置的变换矩阵
变量名 | 描述 |
---|---|
UNITY_MATRIX_MVP | 模型·观察·投影矩阵,用于将顶点/方向矢量从模型空间下变换到裁剪空间 |
UNITY_MATRIX_MV | 模型·观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间 |
UNITY_MATRIX_V | 观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间 |
UNITY_MATRIX_P | 投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间 |
UNITY_MATRIX_VP | 观察·投影矩阵,用于将顶点、方向矢量从世界空间变换到裁剪空间 |
UNITY_MATRIX_T_MV | UNITY_MATRIX_MV的转置矩阵 |
UNITY_MATRIX_IT_MV | UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵 |
_Object2World | 模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间 |
_World2Object | _Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间 |
CG标准库函数
功能 | 描述 |
---|---|
数学函数 | |
abs(x) | x的绝对值 |
acos(x) | x的反余弦 |
all(x) | x的每个分量不等于0返回true,否则返回true |
any(x) | x的任何组件不等于0,则返回true,否则返回false |
asin(x) | x的反正弦 |
atan(x) | x的反正切 |
atan2(y,x) | y/x的反正切 |
ceil(x) | 向下取整 |
clamp(x,a,b) | 限制x的范围在a和b之间,如果x小于a则返回a,如果x大于b返回b,否则返回x |
cos(x) | x的余弦 |
cosh(x) | x的双曲余弦 |
cross(a,b) | a和b的叉积,a和b都是向量 |
degrees(x) | radTodeg转换 |
determinant(m) | 矩阵m的行列式 |
dot(a,b) | a和b的点积 |
exp(x) | 指数 |
exp2(x) | 以2为底数的指数 |
floor(x) | 最大整数,不大于x |
fmod(x,y) | x/y的余数,与x的符号相同 |
frac(x) | x的分数 |
frexp(x,out exp) | 将x分割为区间[1/2,1]中的归一化分数,其返回,并且幂2,存在exp中 |
isfinite(x) | x是有限的则返回true |
isinf(x) | x是无穷的返回true |
isnan(x) | x是NaN(非数字)返回true |
ldexp(x,n) | x*2n |
lerp(a,b,f) | 线性插值,(1-f)a+bf |
lit(a,b,m) | 计算环境光,漫反射和镜面光的照明系数 |
log(x) | 自然数对数ln(x) |
log2(x) | 基于2的对数x |
log10(x) | 基于10的对数 |
max(a,b) | 返回最大值 |
min(a,b) | 返回最小值 |
modf(x,out ip) | 将x拆分为整数和小数部分,每部分都具有与x相同的符号。 |
mul(m,n) | 矩阵m和矩阵n的乘积 |
mul(m,v) | 矩阵m和列向量v的乘积 |
mul(v,m) | 行向量v与矩阵m的乘积 |
noise(x) | 一维,二维或三位噪声函数,取决于参数的类型,返回值介于0-1之间。并对于输入的给定值始终相同 |
pow(x,y) | xy |
radians(x) | 度数到弧度转换 |
round(x) | 最接近x的整数 |
rsqrt(x) | x的倒数平方根 |
saturate(x) | 将x定位到[0,1]范围 |
sign(x) | 符号, 1, 0 或 -1 ,sign(x)或者Sign(x)叫做符号函数,在数学和计算机运算中,其功能是取某个数的符号(正或负) |
sin(x) | x的正弦 |
sincos(float x,out s,out e) | s设置为x的正弦,e设置为x的余弦值 |
sinh(x) | x的双曲正弦 |
smoothstep(min,max,x) | 对于min和max 之间的x值,返回一个平滑变化的值,范围从x=min时的0到x=max时的1 |
step(a,x) | x<a 为0,x>=a为1 |
sqrt(x) | x的平方根 |
tan(x) | x的正切 |
tanh(x) | x的双曲正切 |
transpose(m) | 矩阵m的矩阵转置 |
语义:
|名称|类别|类型(通常)|描述|
UNITY_PROJ_COORD | HLSLSupport.cginc | UNITY_PROJ_COORD(a) | 输入一个四维向量,返回一个适合投影纹理读取的纹理坐标。大多数平台上,这直接返回给定值。 |
---|---|---|---|
POSITION | 应用到顶点着色器(app2vertiex) | float4 | 模型空间中的顶点位置 |
NORMAL | (同上) | float3 | 顶点法线 |
TANGENT | (同上) | float4 | 顶点切线 |
TEXCOORD0 ~ TEXCOORD7 | (同上) | float2或float4 | 顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,以此类推 |
COLOR | (同上) | fixed4或float4 | 顶点颜色 |
SV_POSITION | 顶点着色器到片元着色器 | float4 | 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量 ,等同于DircetX9中的POSITION,但最好使用SV_POSITION |
COLOR0 | (同上) | fixed4或float4 | 输出第一组顶点颜色 |
COLOR2 | (同上) | fixed4或float4 | 输出第二组顶点颜色 |
TEXCOORD0~TEXCOORD7 | (同上) | float2或float4 | 输出纹理坐标或其他值 |
SV_Target | 片段到最终渲染目标 | fixed4 | 输出值会存储到渲染目标中,等同于DircetX9中的COLOR,但最好使用SV_TARGET |
常用计算:
用途 | 实现 |
---|---|
计算观察方向 | float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld,模型空间顶点坐标).xyz) 或 normalize(UnityWorldSpaceViewDir(mul(unity_ObjectToWorld, v.vertex))) |
模型空间坐标转换为世界空间坐标 | mul(unity_ObjectToWorld,模型空间顶点坐标) |
获取屏幕坐标 | ComputeScreenPos(齐次空间坐标) |
获取齐次空间坐标 | UnityObjectToClipPos(模型空间坐标) 或 UnityWorldToClipPos(世界空间坐标) |
获取当前顶点的深度值 | COMPUTE_EYEDEPTH(存储变量) |