Shader-常用的函数

常用文件:
文件路径:{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(存储变量)
发布了32 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_18192161/article/details/90612170