CG标准函数库
有些函数直接和 GPU 指令相对应,所以执行效率非常高。绝大部分标准函数都被重载过,用于支持不同长度的数组和向量作为输入参数。
Cg标准函数会随着未来 GPU硬件的发展而不断优化,所以基于标准函数库写的程序是可以用在以后的 GPU硬件上的。 Cg 标准函数库主要分为五个部分:
数学函数(Mathematical Functions);
几何函数(Geometric Functions);
纹理映射函数(Texture Map Functions)
偏导数函数(Derivative Functions);
调试函数(Debugging Function)
数学函数(Mathematical Functions)
数学函数用于执行数学上常用计算,包括:三角函数、幂函数、园函数、向量和矩阵的操作函数。这些函数都被重载,以支持标量数据和不同长度的向量作为输入参数。
函数 功能
abs(x) 返回输入参数的绝对值
acos(x) 反余切函数,输入参数范围为[-1,1],返回[0,π]区间的角度值
all(x) 如果输入参数均不为0,则返回 ture;否则返回 flase。&&运算
any(x) 输入参数只要有其中一个不为0,则返回 true。||运算
asin(x) 反正弦函数,输入参数取值区间为[−1,1],返回角度值范围为[−π/2 ,π/2 ] atan(x) 反正切函数,返回角度值范围为⎡−π/2 ,π/2⎤
atan2(y,x) 计算y/x 的反正切值。实际上和atan(x)函数功能完全一样,至少输入参数不同。atan(x) = atan2(x, float(1))
ceil(x) 对输入参数向上取整。例如:ceil(float(1.3)),其返回值为 2.0
clamp(x,a,b) 如果x 值小于 a,则返回a;如果 x 值大于 b,返回b;否则,返回 x
cos(x) 返回弧度 x 的余弦值。返回值范围为[−1,1] osh(x) 双曲余弦(hyperbolic cosine)函数,计算x 的双曲余弦值
cross(A,B) 返回两个三元向量的叉积(cross product)。注意,输入参数必须是三元向量
degrees(x) 输入参数为弧度值(radians),函数将其转换为角度值(degrees)
determinant(m) 计算矩阵的行列式因子
dot(A,B) 返回A 和 B的点积(dot product)。参数A 和 B 可以是标量,也可以是向量(输入参数方面,点
积和叉积函数有很大不同)
exp(x) 计算ex的值,e= 2.71828182845904523536
exp2(x) 计算2x的值
floor(x) 对输入参数向下取整。例如floor(float(1.3)) 返回的值为1.0;但是 floor(float(-1.3))返回的值为-2.0。
fmod(x,y) 返回x/y 的余数。如果 y 为 0,结果不可预料
frexp(x, out exp) 将浮点数 x 分解为尾数和指数,即x = m* 2^exp,返回m,并将指数存入 exp 中;如果 x 为 0,则尾数和指数都返回0
frac(x) Returns the fractional portion of a scalar or each vector component
isfinite(x) 判断标量或者向量中的每个数据是否是有限数,如果是返回true;否则返回false;无限的或者非数据(not-a-number NaN)
isinf(x) 判断标量或者向量中的每个数据是否是无限,如果是返回 true;否则返回 false;
isnan(x) 判断标量或者向量中的每个数据是否是非数据(not-a-number NaN),如果是返回true;否则返回false;
ldexp(x, n) 计算x∗2n的值
lerp(a, b, f) 计算(1−f )∗ + ∗a b f或者a+f ∗ −(b a)的值。即在下限a 和上限 b 之间进行插值,f表示权值。注意,如果 a和 b 是向
量,则权值 f必须是标量或者等长的向量。
lit(NdotL,NdotH, m) N表示法向量;L 表示入射光向量;H表示半角向量;m 表示高光系数。
函数计算环境光、散射光、镜面光的贡献,返回的 4元向量:
1.位表示环境光的贡献,总是 1.0;
2.位代表镜面光的贡献,如果 N •L<0,则为0;否则为 N •L;
3.位代表镜面光的贡献,如果N •L<0或者 N •H <0 ,则位 0;否则为(N •H)m;
W位始终位 1.0
log(x) 计算ln(x)的值,x必须大于 0
log2(x) 计算log(2x)的值,x 必须大于 0
log10(x) 计算log10(x)的值,x必须大于 0
max(a, b) 比较两个标量或等长向量元素,返回 大值
min(a,b) 比较两个标量或等长向量元素,返回 小值
modf(x, out ip) | |
mul(M, N) | 计算两个矩阵相乘,如果 M 为 AxB 阶矩阵,N为 BxC阶矩阵,则返回 AxC 阶矩阵。下面两个函数为其重载函数。 |
mul(M, v) | 计算矩阵和向量相乘 |
mul(v, M) | 计算向量和矩阵相乘 |
noise( x) | 噪声函数,返回值始终在 0,1之间;对于同样的输入,始终返回相同的值(也就是说,并不是真正意义上的随机噪声)。 |
pow(x, y) | |
radians(x) | 函数将角度值转换为弧度值 |
round(x) | Round-to-nearest,或closest integer to x即四舍五入 |
rsqrt(x) | X 的反平方根,x必须大于 0 |
saturate(x) | 如果 x 小于0,返回 0;如果 x大于 1,返回1;否则,返回x |
sign(x) | 如果 x 大于0,返回 1;如果 x小于 0,返回01;否则返回0。 |
sin(x) | 输入参数为弧度,计算正弦值,返回值范围为[−1,1] |
sincos(float x, out s, out c) | 该函数是同时计算 x的 sin值和 cos值,其中 s=sin(x),c=cos(x)。该函数用于“同时需要计算sin 值和cos 值的情况”,比分别运算要快很多! |
sinh(x) | 计算双曲正弦(hyperbolic sine)值。 |
smoothstep(min, max, x) | 值 x 位于min、max区间中。如果 x=min,返回0;如果 x=max,返回 1;如果 x在两者之间,按照下列公式返回数据: x−min x−min −2*()3+3*( )2 max−min max−min |
step(a, x) | 如果 x<a,返回0;否则,返回1。 |
sqrt(x) | 求 x的平方根, x ,x必须大于 0。 |
tan(x) | 输入参数为弧度,计算正切值 |
tanh(x) | 计算双曲正切值 |
transpose(M) | M 为矩阵,计算其转置矩阵 |
几何函数(Geometric Functions)
Cg语言标准函数库中有
3 个几何函数会经常被使用到,分别是:normalize函数,对向量进行归一化;reflect函数,计算反射光方向向量;refract函数,计算折射光方向向量。注意:
1 着色程序中的向量 好进行归一化之后再使用,否则会出现难以预料的错误;
2 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)
函数 |
tex1D(sampler1D tex, float s) 一维纹理查询 |
tex1D(sampler1D tex, float s, float dsdx, float dsdy) 使用导数值(derivatives)查询一维纹理 |
Tex1D(sampler1D tex, float2 sz) 一维纹理查询,并进行深度值比较 |
Tex1D(sampler1D tex, float2 sz, float dsdx,float dsdy) 使用导数值(derivatives)查询一维纹理,并进行深度值比较 |
Tex1Dproj(sampler1D tex, float2 sq) 一维投影纹理查询 |
Tex1Dproj(sampler1D tex, float3 szq) 一维投影纹理查询,并比较深度值 |
Tex2D(sampler2D tex, float2 s) 二维纹理查询 |
Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy) 使用导数值(derivatives)查询二维纹理 |
Tex2D(sampler2D tex, float3 sz) 二维纹理查询,并进行深度值比较 |
Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy) 使用导数值(derivatives)查询二维纹理,并进行深度值比较 |
Tex2Dproj(sampler2D tex, float3 sq) 二维投影纹理查询 |
Tex2Dproj(sampler2D tex, float4 szq) 二维投影纹理查询,并进行深度值比较 |
texRECT(samplerRECT tex, float2 s) |
texRECT (samplerRECT tex, float2 s, float2 dsdx, float2 dsdy) |
texRECT (samplerRECT tex, float3 sz) |
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) |
texRECT proj(samplerRECT tex, float3 sq) |
texRECT proj(samplerRECT tex, float3 szq) |
Tex3D(sampler3D tex, float s) 三维纹理查询 |
Tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy) 结合导数值(derivatives)查询三维纹理 |
Tex3Dproj(sampler3D tex, float4 szq) 查询三维投影纹理,并进行深度值比较 |
texCUBE(samplerCUBE tex, float3 s) 查询立方体纹理 |
texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy) 结合导数值(derivatives)查询立方体纹理 |
texCUBEproj (samplerCUBE tex, float4 sq) 查询投影立方体纹理 |
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对应一个像素位置,返回该像素值在X 轴上的偏导数 |
- 函数 ddx和 ddy 用于求取相邻像素间某属性的差值;
- 函数 ddx和 ddy 的输入参数通常是纹理坐标;
- 函数 ddx和 ddy 返回相邻像素键的属性差值;
来源:http://www.le-more.com/?p=534
Unity 中Shader函数
- uint CreateShader(enum type)
创建空的shader object,type: VERTEX_SHADER, - void ShaderSource(uint shader, sizeicount, const **string, const int *length)
加载shader源码进shader object;可能多个字符串 - void CompileShader(uint shader)
编译shader object,shader object有状态 表示编译结果 - void DeleteShader( uint shader )
删除 shader object; - void ShaderBinary( sizei count, const uint *shaders, enum binaryformat,const void *binary, sizei length )
加载预编译过的shader 二进制串; - uint CreateProgram( void )
创建空的program object,programe object组织多个shader object,成为 executable; - void AttachShader( uint program, uint shader )
关联shader object和program object; - void DetachShader( uint program, uint shader )
解除关联; - void LinkProgram( uint program )
program object准备执行,其关联的shader object必须编译正确且符合限制条件; - void UseProgram( uint program )
执行program object; - void ProgramParameteri( uint program, enum pname, int value )
设置program object的参数; - void DeleteProgram( uint program )
删除program object;SHADER 常用变量:
- qualifier:默认无修饰符,普通变量读写, 与外界无连接;
- const:常量 const vec3 zAxis = vec3(0.0, 0.0, 1.0);
- attribute:申明传给vertex shader的变量;只读;不能为array或struct;
attribute vec4 position; - uniform: 表明整个图元处理中值相同;只读;
uniform vec4 lightPos; - varying:被差值;读写;
varying vec3 normal; - in, out, inout;
SHADER变量的精度:
highp, mediump, lowp SHADER内置变量:
- gl_Position: 用于vertex shader, 写顶点位置;被图元收集、裁剪等固定操作功能所使用;其内部声明是:
highp vec4 gl_Position; - gl_PointSize: 用于vertex shader, 写光栅化后的点大小,像素个数;其内部声明是:mediump float gl_Position;
- gl_FragColor: 用于Fragment shader,写fragment color;被后续的固定管线使用;
mediump vec4 gl_FragColor; -
gl_FragData: 用于Fragment shader,是个数组,写gl_FragData[n] 为data n;被后续的固定管线使用;
mediump vec4 gl_FragData[gl_MaxDrawBuffers];
gl_FragColor和gl_FragData是互斥的,不会同时写入; -
gl_FragCoord: 用于Fragment shader,只读, Fragment相对于窗口的坐标位置 x,y,z,1/w; 这个是固定管线图元差值后产生的;z 是深度值;
mediump vec4 gl_FragCoord; -
gl_FrontFacing: 用于判断 fragment是否属于 front-facing primitive;只读;
bool gl_FrontFacing; - gl_PointCoord: 仅用于 point primitive;
mediump vec2 gl_PointCoord;SHADER内置常量:
- const mediump int gl_MaxVertexAttribs = 8;
-
const mediump int gl_MaxVertexUniformVectors = 128;
-
const mediump int gl_MaxVaryingVectors = 8;
-
const mediump int gl_MaxVertexTextureImageUni ts = 0;
-
const mediump int gl_MaxCombinedTextureImageU nits = 8;
-
const mediump int gl_MaxTextureImageUnits = 8;
-
const mediump int gl_MaxFragmentUnitformVecto rs = 16;
-
const mediump int gl_MaxDrawBuffers = 1;
SHADER内置函数(一般默认都用弧度)
-
radians(degree) : 角度变弧度; -
degrees(radian) : 弧度变角度; -
sin(angle), cos(angle), tan(angle) -
asin(x): arc sine, 返回弧度 [-PI/2, PI/2]; -
acos(x): arc cosine,返回弧度 [0, PI]; -
atan(y, x): arc tangent, 返回弧度 [-PI, PI]; -
atan(y/x): arc tangent, 返回弧度 [-PI/2, PI/2]; -
pow(x, y): x的y次方; -
exp(x): 指数 - log(x):返回以e为底的对数。
- exp2(x): 2的x次方
- log2(x):返回以2为底的对数。
- log10:返回以10为底的对数。
-
sqrt(x): x的根号; - inversesqrt(x): x根号的倒数
-
abs(x): 绝对值 -
sign(x): 符号, 1, 0 或 -1 {sign(x)或者Sign(x)叫做符号函数,在数学和计算机运算中,其功能是取某个数的符号(正或负): 当x>0,sign(x)=1;
当x=0,sign(x)=0;
当x<0, sign(x)=-1;} floor(x): 底部取整 -
ceil(x): 顶部取整 -
fract(x): 取小数部分 -
mod(x, y): 取模, x – y*floor(x/y) - fmode(x,y):返回x/y的余数,符号同x。如果y为0,结果不可预料。
-
min(x, y): 取最小值 -
max(x, y): 取最大值 -
clamp(x, min, max): min(max(x, min), max); -
mix(x, y, a): x, y的线性混叠, x(1-a) + y*a; -
step(edge, x): Returns (x >= edge) ? 1 : 0 -
smoothstep(edge0, edge1, x): threshod smooth transition时使用。 edge0<=edge0时为0.0, x>=edge1时为1.0 -
length(x): 向量长度 -
distance(p0, p1): 两点距离, length(p0-p1); - dot(x, y): 点积,各分量分别相乘 后 相加
-
cross(x, y): 差积,x[1]*y[2]-y[1]*x[2], x[2]*y[0] – y[2]*x[0], x[0]*y[1] – y[0]*x[1] -
normalize(x): 归一化, length(x)=1; -
faceforward(N, I, Nref): 如 dot(Nref, I)< 0则N, 否则 -N -
reflect(I, N): I的反射方向, I -2*dot(N, I)*N, N必须先归一化 -
refract(I, N, eta): 折射,k=1.0-eta*eta*(1.0 – dot(N, I) * dot(N, I));
如k<0.0 则0.0,否则 eta*I – (eta*dot(N, I)+sqrt(k))*N matrixCompMult(matX, matY):矩阵相乘, 每个分量 自行相乘, 即 r[j] = x[j]*y[j]; 矩阵线性相乘,直接用 * - lessThan(vecX, vecY): 向量 每个分量比较 x < y
- lessThanEqual(vecX, vecY): 向量 每个分量比较 x<=y
- greaterThan(vecX, vecY): 向量 每个分量比较 x>y
- greaterThanEqual(vecX, vecY): 向量 每个分量比较 x>=y
- equal(vecX, vecY): 向量 每个分量比较 x==y
- notEqual(vecX, vexY): 向量 每个分量比较 x!=y
- any(bvecX): 只要有一个分量是true, 则true
- all(bvecX): 所有分量是true, 则true
- not(bvecX): 所有分量取反
- saturate(x) :Clamps x to the range [0, 1],如果x是矢量,则对每个分量截取
- texture2D(sampler2D, coord): texture lookup
- texture2D(sampler2D, coord, bias): LOD bias, mip-mapped texture
- texture2DProj(sampler2D, coord):
- texture2DProj(sampler2D, coord, bias):
- texture2DLod(sampler2D, coord, lod):
- texture2DProjLod(sampler2D, coord, lod):
- textureCube(samplerCube, coord):
- textureCube(samplerCube, coord, bias):
- textureCubeLod(samplerCube, coord, lod):
UNITY常用的包含文件:
- UnityCG.cginc:包含最常用的帮助函数,宏和结构体;
- UnityShaderVariables.cginc:包含内置的全局变量,自动包含;
- Lighting.cginc:包含各种内置的光照模型,如果是表面着色器会自动包含;
- HLSLSupport.cginc:声明用于跨平台编译的宏和定义,自动包含;
UNITYCG.CGINC 中常用的结构体
- appdeat_base:顶点着色器的输入,包含顶点位置,顶点法线,第一组纹理坐标
- appdata_tan:顶点着色器的输入,包含顶点位置,顶点切线,顶点法线,第一组纹理坐标;
- appdata_full:顶点着色器的输入,包含顶点位置,顶点切线,顶点法线,四个纹理坐标;
- appdata_img:顶点着色器的输入,包含顶点位置,第一组纹理坐标;
- v2f_img:顶点着色器的输出,裁剪空间的位置,纹理坐标;
UNITYCG.CGINC常用的帮助函数
- float3 WorldSpaceViewDir(float4 v):输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向;
- float3 UnityWorldSpaceViewDir(float4 v):输入一个世界空间中的顶点位置,返回世界空间中从从该点到摄像机的观察方向
- float3 ObjSpaceLightDir(float4 v):输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察位置;
- float3 ObjSpaceViewDir(float4 v):输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
- float3 WorldSpaceLightDir(float4 v):仅用于前向渲染。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化;
- float3 ObjSpaceLightDir(float4 v):仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被归一化;
- float3 UnityObjectToWorldNormal(float3 normal):把法线方向从模型空间转换到世界空间中;
- float3 UnityObjectToWorldDir(float3 dir):把方向矢量从模型空间变换到世界空间中;
- float3 UnityWorldToObjectDir(float3 dir):把方向矢量从世界空间变换到模型空间中;
其他
- TANGENT_SPACE_ROTATION:计算模型到切线的矩阵
- UnpackNormal:获取切线坐标下的法线
- UNITY_LIGHTMODEL_AMBIENT:环境光
_MainTex_TexelSize
{TextureName}_TexelSize
– a float4 property contains texture size information:x
contains 1.0/widthy
contains 1.0/heightz
contains widthw
contains height