Unity Shader 常用函数
Unity Shader常用函数列表
Unity内置矩阵(float4x4)
UNITY_MATRIX_MVP 当前模型 视图 投影 矩阵
UNITY_MATRIX_MV 当前模型 视图 矩阵
UNITY_MATRIX_V 当前视图矩阵。
UNITY_MATRIX_P 目前的投影矩阵
UNITY_MATRIX_VP 当前视图 投影 矩阵
UNITY_MATRIX_T_MV 模型视图转 矩阵
UNITY_MATRIX_IT_MV 模型视图逆 转 矩阵
UNITY_MATRIX_TEXTURE0 UNITY_MATRIX_TEXTURE3 纹理变换矩阵
CG标准函数库
Cg 标准函数库主要分为五个部分:
数学函数(Mathematical Functions)
几何函数(Geometric Functions)
纹理映射函数(Texture Map Functions)
偏导数函数(Derivative Functions)
调试函数(Debugging Function)
数学函数(Mathematical Functions)
数学函数用于执行数学上常用计算,包括:三角函数、幂函数、园函数、向量和矩阵的操作函数。这些函数都被重载,以支持标量数据和不同长度的向量作为输入参数。
1 | abs(x) 返回输入参数的绝对值 |
常用
1 | modf(x, out ip) |
几何函数(Geometric Functions)
Cg语言标准函数库中有
3 个几何函数会经常被使用到,分别是:
normalize函数,对向量进行归一化;reflect函数,计算反射光方向向量;refract函数,计算折射光方向向量。
注:
- 着色程序中的向量 好进行归一化之后再使用,否则会出现难以预料的错误;
- reflect函数和refract函数都存在以“入射光方向向量”作为输入参数,注意这两个函数中使用的入射光方向向量,是从外指向几何顶点的;平时我们在着色程序中或者在课本上都是将入射光方向向量作为从顶点出发。
函数 | 功能 |
---|---|
distance( pt1, pt2) | 两点之间的欧几里德距离(Euclidean distance) |
faceforward(N,I,Ng) | 如果Ng I• <0 ,返回N;否则返回-N。 |
length(v) | 返回一个向量的模,即 sqrt(dot(v,v)) |
normalize( v) | 归一化向量 |
reflect(I, N) | 根据入射光方向向量 I,和顶点法向量N,计算反射光方向向量。其中I 和N 必须被归一化,需要非常注意的是,这个I 是指向顶点的;函数只对三元向量有效 |
refract(I,N,eta) | 计算折射向量,I为入射光线,N为法向量,eta为折射系数;其中 I 和N 必须被归一化,如果I 和N 之间的夹角太大,则返回(0,0,0),也就是没有折射光线;I是指向顶点的;函数只对三元向量有效 |
纹理映射函数(Texture Map Functions)
1 | tex1D(sampler1D tex, float s) 一维纹理查询 |
s象征一元、二元、三元纹理坐标;z代表使用“深度比较(depth comparison)”的值;
q表示一个透视值(perspective value,其实就是透视投影后所得到的齐次坐标的 后一位),这个值被用来除以纹理坐标(S),得到新的纹理坐标(已归一化到0 和1 之间)然后用于纹理查询。
纹理函数非常多,总的来说,按照纹理维数进行分类,即:1D纹理函数, 2D 纹理函数,3D纹理函数,已经立方体纹理。
需要注意,TexREC函数查询的纹理实际上也是二维纹理。
3D 纹理,另一个比较学术化的名称是“体纹理(Volume Texture)”,体纹理通常用于体绘制,体纹理用于记录空间中的体细节数据。
还有一类较为特殊的纹理查询函数以 proj 结尾,主要是针对投影纹理进行查询。
所谓投影纹理是指:将纹理当做一张幻灯片投影到场景中,使用投影纹理技术需要计算投影纹理坐标,然后使用投影纹理坐标进行查询。
使用投影纹理坐标进行查询的函数就是投影纹理查询函数。
本质来说,投影纹理查询函数和普通的纹理查询函数没有什么不同,唯一的区别在于“投影纹理查询函数使用计算得到的投影纹理坐标,并在使用之前会将该投影纹理坐标除以透视值”。
举例而言,计算得到的投影纹理坐标为float4 uvproj,使用二维投影纹理查询函数:
tex2Dproj(texture,uvproj);等价于按如下方法使用普通二维纹理查询函数:
float4 uvproj = uvproj/uvproj.q; tex2D(texture,uvproj);
偏导函数(Derivative Functions)
函数 | 功能 |
---|---|
ddx(a) | 参数 a对应一个像素位置,返回该像素值在X 轴上的偏导数 |
ddy(a) | 参数 a对应一个像素位置,返回该像素值在Y 轴上的偏导数 |
- 函数 ddx和 ddy 用于求取相邻像素间某属性的差值;
- 函数 ddx和 ddy 的输入参数通常是纹理坐标;
- 函数 ddx和 ddy 返回相邻像素键的属性差值;
float3 WorldSpaceViewDir (float4 v):根据给定的局部空间顶点位置到相机返回世界空间的方向(非规范化的)
float3 ObjSpaceViewDir (float4 v) - returns object space direction (not normalized) from given object space vertex position towards the camera.
float3 ObjSpaceViewDir (float4 v):根据给定的局部空间顶点位置到相机返回局部空间的方向(非规范化的)
float2 ParallaxOffset (half h, half height, half3 viewDir) - calculates UV offset for parallax normal mapping.
float2 ParallaxOffset (half h, half height, half3 viewDir):为视差法线贴图计算UV偏移
fixed Luminance (fixed3 c) - converts color to luminance (grayscale).
fixed Luminance (fixed3 c):将颜色转换为亮度(灰度)
fixed3 DecodeLightmap (fixed4 color) - decodes color from Unity lightmap (RGBM or dLDR depending on platform).
fixed3 DecodeLightmap (fixed4 color):从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR)
float4 EncodeFloatRGBA (float v) - encodes [0..1) range float into RGBA color, for storage in low precision render target.
float4 EncodeFloatRGBA (float v):为储存低精度的渲染目标,编码[0..1)范围的浮点数到RGBA颜色。
float DecodeFloatRGBA (float4 enc) - decodes RGBA color into a float.
float DecodeFloatRGBA (float4 enc):解码RGBA颜色到float。
Similarly, float2 EncodeFloatRG (float v) and float DecodeFloatRG (float2 enc) that use two color channels.
同样的,float2 EncodeFloatRG (float v) 和float DecodeFloatRG (float2 enc)使用的是两个颜色通道。
float2 EncodeViewNormalStereo (float3 n) - encodes view space normal into two numbers in 0..1 range.
float2 EncodeViewNormalStereo (float3 n):编码视图空间法线到在0到1范围的两个数。
float3 DecodeViewNormalStereo (float4 enc4) - decodes view space normal from enc4.xy.
float3 DecodeViewNormalStereo (float4 enc4):从enc4.xy解码视图空间法线
Forward rendering helper functions in UnityCG.cginc
UnityCG.cginc正向渲染辅助函数
These functions are only useful when using forward rendering (ForwardBase or ForwardAdd pass types).