百人计划 图形2.3 常用函数介绍
HLSL(微软定义的高阶着色器语言:High Level Shader Language)
基本数学运算
函数 | 作用 |
max(a,b) | 返回较大的那个 |
min(a,b) | 返回小的那个 |
mul(a,b) | 两数相乘,常用于矩阵运算 |
abs(a) | 返回输入值的绝对值 |
round(x) | 返回与x最近的整数 |
sqrt(x) | 返回x的平方根 |
rsqrt(x) | 返回x的平方根的倒数 |
degrees(x) | 转换成弧度 |
radians(x) | 将角度转换为弧度 |
noise(x) | 噪声函数:返回一个the Perlin noise value within a range between -1 and 1. |
幂指对函数
函数 | 作用 |
pow(x,y) | x的y次幂 |
ldexp(x,exp) | x*2exp |
exp(x) | 返回以e为底的指数函数 |
exp2(x) | 返回以2为底,幂是x的的指数函数 |
log(x) | 返回以e为底的对数(ln(x)) |
log10(x) | 返回以10为底的对数 |
log2(x) | 返回以2为底的对数 |
frexp(x,out exp) | 把浮点值x分解为指数和尾数,返回值是尾数,exp参数返回的值是指数(如果x参数为0,则此函数的尾数和指数均返回0) |
out关键字:传值引用,不要求在传值钱初始化变量。
三角函数与双曲线函数
函数 | 作用 |
asin(x) | 返回输入值的反正弦值 |
acos(x) | 返回输入值的反余弦值 |
atan(x) | 返回输入值的反正切值 |
atan2(y,x) | 返回y/x的反正切值 |
sincos(x,out s,out c) | 返回x的正弦值和余弦值 |
tan(y,x) | 返回y/x的正切值 |
sinh(x) | 返回x的双曲正弦值,即0.5*(e^x-e^-x) |
cosh(x) | 返回x的双曲余弦值,即0.5*(e^x+e^-x) |
tanh(x) | 返回x的双曲正切值,即(e^x-e^-x)/(e^x+e^-x) |
其中sin(x)、cos(x)、tan(x)中x均为弧度
数据范围类
函数 | 作用 |
ceil(x) | 返回>=x的最小整数 |
step(x,y) | x<=y则为1,否则为0 |
floor(x) | 返回小于或者等于x的最大整数 |
saturate(x) | 返回将x钳制到(0,1) |
clamp(x,min,max) | 把x限制在[min,max] |
frac(x) | 返回x的小数部分 |
modf(x,out ip) | 将x分为整数和小数部分(各部分符号与x相同),ip返回整数部分,整体返回小数部分。 |
smoothstep(min,max,x) | 如果x在(min,max)内,则返回在(0,1)之间的光滑Hermite插值,使用smoothstep HLSL内在函数在两个值之间创建平滑过渡。例如使用此函数平滑过渡两种颜色。 |
lerp(x,y,s)=x*(1-s)+y*s
类型判断
all(x):确定指定量的所有分量是否均为非零,均非零返回true,否则返回false(处理由浮点型、整形、布尔型数据定义的标量、向量、矩阵)
clip(x):如果输入值小于0,则丢弃当前像素。常用于判定范围(不仅仅针对0,返回值为void)常用于测试alpha。如果每个分量代表到平面的距离,还可以用来模拟剪切平面。
sign(x):x小于0 返回-1,x大于0返回1,相等于0返回0。
isfinite(x):判断x参数是有限的(有界)。
isnan(x):如果x参数为NAN(非数字),返回true否则返回false
向量与矩阵类
length(v):返回向量的长度(x/length(x)方向向量归一化)
normalize(v):向量归一化
distance(a,b):返回两个向量间距离(按理说不平行时应该是0),此处表示为根号下各分量之差的平方和。
dot(a,b):返回a,b两个向量的标积、内积、数量积、点积(a在b上的投影长:a·b=|a||b|cosθ)。
cross(a,b):返回a,b两个向量的矢积、外积、向量积、叉积(返回一个与a,b向量所在平面垂直的向量(即该平面的法线))
determinant(m):返回指定浮点矩阵按行列式方式计算的值
transpose(m):返回矩阵m的转置矩阵
光线运算类
reflect(i,n):i为入射向量,n为法线方向的反射光
refract(i,n,ri):以i为入射向量,n为法线方向,ri为反射率的折射光
lit(n_dot_l,n_dot_ h,m):输入标量(normal、light、半角向量h、镜面反射系数m)返回光照向量(环境光、漫反射光、镜面高光反射、1) 下图Blinn Phong模型
faceforward(n,i,ng):得到面向示图方向的曲面法线向量,输入输出为同元向量,返回-n*sign(dot(i,ng)) (normal, light,normal)
1D纹理查找
GPU在PS阶段是在屏幕空间XY坐标系中对每一个像素去查找对应的纹素来确定像素的颜色。
tex1D(s,t):普通一维纹理查找,返回纹理采样器s在标量t位置的color4。
tex1D(s,t,ddx,ddy):使用微分查询一维纹理(t和ddxy均为vector)
tex1Dlod(s.t):使用LOD查找纹理s在t.w位置的color4
tex1Dbias(s,t):将t.w决定的某个MIP层偏置后的一维纹理查找
tex1Dgrad(s,t,ddx.ddy):使用微分并指定MIP层的一维纹理查找
tex1Dproj(s,t):把纹理当作一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询
2D纹理查询
tex2D(s,t):普通二维纹理查找,返回纹理采样器s在vector t位置的颜色
tex2D(s,t,ddx,ddy):使用微分查询二维纹理(t和ddxy均为vector )
tex2Dlod(s,t)):使用LOD查询纹理s在t.w位置的color4
tex2Dbias(s,t):将t.w决定的某个MIP层偏置后的二维纹理查找
tex2Dgrad(s,t,ddx,ddy):使用微分并指定MIP层的二维查找
tex2Dproj(s,t):把纹理当作一张幻灯片投影到场景中先使用纹理投影技术计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询。
3D纹理查询(二维图片的叠加)
tex3D(s,t):普通三维纹理查找,返回纹理采样器s在vector t位置的颜色
tex3D(s,t,ddx,ddy):使用微分查询三维纹理 (t和ddxy均为vector)
tex3Dlod(s,t):使用LOD查询纹理s在t.w位置的color4
tex3Dbias(s,t):将t.w决定的某个MIP层偏置后的三维纹理查找
tex3Dgrad(s,t,ddx,ddy):使用微分并指定MIP层的三位纹理查找
text3Dproj(s,t):把纹理当作一张幻灯片投影到场景中,先使用纹理投影技术需要计算出投影纹理坐标(t.w除以透视值),然后使用投影纹理坐标进行查询。
lod:查找时使用mipmap图;bias:查找mipmap后使用偏置;grad:使用微分并指定miamap层的查找
texCUBE(s,t):返回纹理采样器s在vector t位置的颜色
texCUBE(s,t,ddx,ddy):使用微分查询立方体(t,ddxy都是 vector)
texCUBEDload(s,t):使用LOD查询纹理s在t.w位置的color4
texCUBEbias(s,t):将t.w决定的某个mipmap层偏移后的立方体查找
texCUBEgrad(s,t,ddx,ddy):使用微分并指定Mip层的立方体纹理查找
textCUBEproj(s,t):是用投影方式的立方体纹理查找
作业
1、最常用的5个函数:dot、normalize、mul、distance、tex2D(s,t)
2、ddx、ddy实际使用测试
发布评论