Shader-常用的函数

本文详细介绍了Unity Shader编程中常用的内置函数、宏和变量,包括坐标空间转换、光照模型、混合操作及标准库函数等。适用于Unity开发者深入了解Shader编程,提升游戏画面效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用文件:
文件路径:{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)
描述:局部坐标转换位齐次坐标
UnityObjectToViewPosUnityCG.cginc
UnityObjectToWorldDir文件:UnityCG.cginc
格式:float3 UnityObjectToWorldDir(in float3 dir)
描述:把方向矢量从模型空间转换到世界空间中
UnityObjectToWorldNormal文件:UnityCG.cginc
格式:float3 UnityObjectToWorldNormal(in float3 norm)
描述:将模型空间下的法线转为世界空间下的法线
UnityWorldToClipPosUnityCG.cginc
UnityWorldToViewPosUnityCG.cginc
UnityWorldToObjectDir文件:UnityCG.cginc
格式:float3 UnityWorldToObjectDir(float3 dir)
描述:把方向矢量从世界空间变换到模型空间中
UnityWorldSpaceLightDirUnityCG.cginc
WorldSpaceLightDir文件:UnityCG.cginc
格式:float3 WorldSpaceLightDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向(没有归一化,仅可用于向前渲染)
ObjSpaceLightDir文件:UnityCG.cginc
格式:float3 ObjSpaceLightDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向(没有归一化,仅可用于向前渲染)
UnityWorldSpaceViewDirUnityCG.cginc
WorldSpaceViewDir文件:UnityCG.cginc
格式:float3 WorldSpaceViewDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
ObjSpaceViewDir文件:UnityCG.cginc
格式:float3 ObjSpaceViewDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
UnityViewToClipPosUnityCG.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
描述:t是自场景加载开始所经过的时间。4个分量分别为:(t/20,t,t2,t3)
_SinTime文件:UntiyCG.glslinc
定义:uniform vec4 _SinTime
描述:t是时间的正弦值,4个分量分别是(t/8,t/4,t/2,t)
_CosTime文件:UntiyCG.glslinc
定义:uniform vec4 _CosTime
描述:t是时间的余弦值,4个分量分别是(t/8,/4,t/2,t)
_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_MVUNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MVUNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵
_Object2World模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间
_World2Object_Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间

Blend混合

指令描述
Blend Off关闭混合
Blend SrcFactor DstFactorSrcFactor和DstFactor都为混合因子(系数),S是源颜色,D是目的颜色。
公式:
Colorrgb = SrcFactor *Srgb + DstFactor * Drgb
Colora = SrcFactor * Sa + DstFactor * Da
Blend SrcFactor DstFactor,SrcFactorA DstFactorASrcFactor和DstFactor都为混合因子(系数),ScrFactorA 和 DstFactorA 是透明通道的混合因子。S是源颜色,D是目的颜色。
公式:
Colorrgb = SrcFactor * Srgb + DstFactor * Drgb
Colora = SrcFactorA * Sa + DstFactorA * Da
混合因子:
One因子1
Zero因子0
SrcColor源颜色
SrcAlpha源颜色的Alpha值
DstColor目标颜色值
DstAlpha目标颜色的Alpha值
OneMinusSrcColor1-源颜色值
OneMinusSrcAlpha1-源颜色的Alpha值
OneMinusDstColor1-目标颜色值
OneMinusDstAlpha1-目标颜色的Alpha值
混合操作指令:BlendOp Operation
Add将源颜色和目的颜色相加(默认)
Sub源颜色减去目的颜色
RevSub目的颜色减去源颜色
Min取源颜色和目的颜色中较小值,逐分量比较
Max取源颜色和目的颜色中较大值,逐分量比较
常见混合命令:
Blend SrcAlpha OneMinusSrcAlpha传统透明度
Blend One OneMinusSrcAlpha预乘透明度
Blend One One叠加
Blend OneMinusDstColor One滤色
Blend DstColor Zero正片叠底
Blend DstColor SrcColor两倍相乘
BlendOp Min
Blend One One
变暗
BlendOp Max
Blend One One
变亮
源颜色(S):片段颜色 目的颜色(D):缓冲取颜色

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_COORDHLSLSupport.cgincUNITY_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(存储变量)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘建宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值