1. 数学函数(Mathematical Functions);
2. 几何函数(Geometric Functions);
3. 纹理映射函数(Texture Map Functions);
4. 偏导数函数(Derivative Functions);
5. 调试函数(Debugging Function);
1 数学函数(Mathematical Functions)
表1中列举了 Cg 标准函数库中所有的数学函数, 这些数学函数用于执行数
学上常用计算,包括:三角函数、幂函数、园函数、向量和矩阵的操作函数。这
些函数都被重载,以支持标量数据和不同长度的向量作为输入参数。
表1:
2 几何函数(Geometric Functions)
几何函数,如表2所示,用于执行和解析几何相关的计算,例如根据入射光向量和顶点法向量,求取反射光和折射光方向向量。 Cg 语言标准函数库中有3 个几何函数会经常被使用到,分别是:normalize 函数,对向量进行归一化;reflect函数,计算反射光方向向量; refract 函数,计算折射光方向向量。注意:
1. 着色程序中的向量最好进行归一化之后再使用,否则会出现难以预料的错误
2. reflect 函数和 refract 函数都存在以"入射光方向向量"作为输入参数,注意这两个函数中使用的入射光方向向量,是从外指向几何顶点的;平时我们在着色程序中或者在课本上都是将入射光方向向量作为从顶点出发。
表2:
函数 | 功能 |
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 是指向顶点的;函数只对三元向量有效。 |
3 纹理映射函数(Texture Map Functions)
表3提供 Cg 标准函数库中的纹理映射函数。这些函数被 ps_2_0、 ps_2_x、arbfp1、 fp30 和fp40 等 profiles 完全支持(fully supported)。所有的这些函数返回四元向量值。
函数 | 功能 | |
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) | 二维非投影矩形纹理查询(OpenGL独有) | |
texRECT (samplerRECT tex, float2 s, float2 dsdx, float2 dsdy) | 二维非投影使用导数的矩形纹理查询(OpenGL独有) | |
二维非投影深度比较矩形纹理查询(OpenGL独有) | ||
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) | 二维非投影深度比较并使用导数的矩形纹理查询(OpenGL独有) | |
texRECT proj(samplerRECT tex, float3 sq) | 二维投影矩形纹理查询(OpenGL独有) | |
texRECT proj(samplerRECT tex, float3 szq) | 二维投影矩形纹理查询(OpenGL独有) | |
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) | 查询投影立方体纹理 |
4 偏导函数(Derivative Functions)
函数 | 功能 |
ddx(a) | 参数 a 对应一个像素位置, 返回该像素值在 X 轴上的偏导数 |
ddy(a) | 参数 a 对应一个像素位置, 返回该像素值在 X 轴上的偏导数 |
5 调试函数(Debugging Function)
函数 | 功能 |
void debug(float4 x) | 如果在编译时设置了 DEBUG,片段着色程序中调用该函数可以将值 x 作为COLOR 语义的最终输出;否则该函数什么也不做。 |