整体分类预览
基本数学运算
幂指对函数与偏导数
数据范围类
类型判断类
三角函数和双曲线函数
向量和矩阵类
光线运算类
1D纹理查找
2D纹理查找
3D纹理查找
立体纹理查找
//详细参考:https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions
一、基本数学运算
max(a,b) 返回较大的
min(a,b) 返回较小的
mul(a,b) 两向量相乘,常用于矩阵运算
abs(a) 返回a的绝对值
round(x) 返回与x最近的整数
sqrt(x) 返回x的平方根
rsqrt(x) 返回x的平方根的倒数
degrees(x) 将弧度转化为角度
redians(x) 将角度转化为弧度
noise(x) 噪声函数
将uv的坐标作为x传入,随机的返回一个[0,1]的值,就会得到一张噪声图
![](https://i-blog.csdnimg.cn/blog_migrate/f6abfc4f465e5a28cf1094c5d0ec4be4.png)
三维纹理的一个例子
![](https://i-blog.csdnimg.cn/blog_migrate/a247162a6729fae9e055ad00a0cf37e2.png)
一个很好用的工具推荐:https://graphtoy.com/ 可以直接将数学公式输入可视化。
二、幂指对函数与偏导数
pow(x,y) x的y次幂(x、y都可以是自变量或具体数)
![](https://i-blog.csdnimg.cn/blog_migrate/1d935a4f8415e3064ea30066f9492233.png)
exp(x) 返回以e为底的指数函数
![](https://i-blog.csdnimg.cn/blog_migrate/572cc23b0acb1b10fd76b39d747dda21.png)
exp2(value x) 返回以2为底,x为指数的幂
![](https://i-blog.csdnimg.cn/blog_migrate/6072423d67670916aed9079203790b8e.png)
ldexp(x,exp) 返回与2的exp次方的乘积
![](https://i-blog.csdnimg.cn/blog_migrate/18b9445c192e58b0a60d98920cc982ed.png)
log(x) 返回指定值的以e为底数的对数
![](https://i-blog.csdnimg.cn/blog_migrate/c5b68f3f47f8af5ef78ac0ae78e799a9.png)
log10(x) 求以10为底的对数
![](https://i-blog.csdnimg.cn/blog_migrate/f9aa0a97e0de47fc68b41387008efab9.png)
log2(x) 求以2为底数的对数
frexp(x,out exp) 把浮点数分解为尾数和指数,x的返回值是尾数(x=ret*2^exp),exp参数返回的是指数
是按照计算机存储浮点数的方式分解的
eg:1.2这个数,是分为两部分的,尾数为12,指数为0.1
out关键字:exp也会作为一个返回值传出,也就是说这个函数有两个返回值。
如果x参数为0,则此函数的尾数和指数均返回0
三、三角函数和双曲线函数
sin(x)、cos(x)、tan(x) 三角函数(弧度制:1°=π/180 rad)
asin(x)、acos(x)、atan(x) 反三角函数
sincos(x,out s,out c) 返回x的正弦和余弦
tan(y,x) 返回y/x的正切
atan2(y,x) 返回y/x的反正切
双曲正余弦
sinh(x) 返回x的双曲正弦值
![](https://i-blog.csdnimg.cn/blog_migrate/f6d8011bca1e14cac198162379b6c2dc.png)
cosh(x) 返回x的双曲余弦值
![](https://i-blog.csdnimg.cn/blog_migrate/a8a0f497b4a445a8c8d91cec53dc4154.png)
tanh(x) 返回x的双曲正弦值
![](https://i-blog.csdnimg.cn/blog_migrate/1f500f01c7eb10f9fd46b89c4cdaf979.jpeg)
双曲函数的参考:https://zh.wikipedia.org/zh-hans/%E5%8F%8C%E6%9B%B2%E5%87%BD%E6%95%B0
四、数据范围类
ceil(x) 返回>=x的最小整数(向下取整)
floor(x) 返回<=x的最大整数(向上取整)
step(x,y) x<=y返回1(真),否则返回0
saturate(x) 返回将x钳制到[0,1]范围之间的值
clamp(x,min,max) 将x限制在[min,max]范围的值,比min小返回min,比max大返回max
fmod(x,y) 返回x对y取余的余数
frac(x) 取x的小数部分
modf(x,out ip) 将x分为小数和整数部分(输出的ip为整数部分,返回值为小数部分)
lerp(x,y,s)按照s在x到y之间插值,返回
smoothstep(min,max,x) 如果x在[min,max]范围内,就返回介于[0,1]之间的平滑Hermite插值,使用smoothstep在两个值直接创建平滑过渡
eg,平滑地混合两种颜色
五、类型判断类
all(x) 确定指定量的所有分量是否均为非零,均非零则返回true,否则返回false(处理由浮点型、整型、布尔型数据定义的标量、向量或者矩阵)
clip(x) 如果输入值小于零,则丢弃当前像素 常用于判定范围(不仅仅针对0,返回值为void)
常用于测试alpha,如果每个分量代表到平面的距离,还可以用来模拟剪切平面
sign(x) 返回x的正负性 如果x小于零返回-1,如果x等于零返回0,如果x大于零返回1
isinf(x) 如果x参数为+ INF或-INF(无穷+无穷仍无穷,0x3f3f3f3f),返回true,否则返回False
isfinite(x) 判断x参数是有限,即有界的,与isinf(x)相反
isnan(x) 如果x参数为NAN(非数字),返回true,否则返回false
六、向量和矩阵类
length(v) 返回向量的长度
normalize(v) 向量归一化,x/length(x) 方向向量归一化
distance(a,b) 返回两个向量之间的距离,不平行的两个向量应该为0,此处表示为根号下各分量之差的平方和
dot(a,b) 点积
cross(a,b) 叉积
具体点积叉积应用可参考GAME101线代部分笔记、TA百人计划1.21的作业
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)
为BlingPhong光照模型(看到这部分了这个应该清楚,参考GAMES101着色部分)
faceforward(n,i,ng) 得到面向视图方向的曲面法向量输入输出为同元向量,返回-n*sign(dot(i,ng))(normal,light,normal)
八、纹理查找
1.一些注意的点:
纹理查找的分类
所有的纹理查找函数都可以分为三类:普通的、微分的、投影的
偏导函数ddx ddy(微分类)
如果函数 ddx 的参数为 myVar,该参数对应的像素点记为p(i,j),则 ddx(myVar)的值为“像素点 p(i+1,j)的值减去myVar”(ddy同理)
如果函数 ddx 和 ddy 的输入参数为常数,则函数返回值永远为 0。
1.函数 ddx 和 ddy 用于求取相邻像素间某属性的差值;
2.函数 ddx 和 ddy 的输入参数通常是纹理坐标;
3.函数 ddx 和 ddy 返回相邻像素键的属性差值;偏导数的物理含义是:在某一个方向上的变化快慢。
所以 ddx 求的是 X 方向上,相邻两个像素的某属性值的变化量
ddy 求的是 Y方向上,相邻两个像素的某属性值的变化量
由于 ddx 和 ddy 指令是作用于像素级的,所以 ddx 和 ddy 函数只被片段程序所支持
mipmap在选择到底用哪一层mipmap的level时,靠的就是偏导数。
投影类
投影纹理是指:将纹理当做一张幻灯片投影到场景中,使用投影纹理技术需要计算投影纹理坐标,然后使用投影纹理坐标进行查询。使用投影纹理坐
标进行查询的函数就是投影纹理查询函数。
Mipmap类
lod 采样一张mipmap
bias 偏置后再采样(由t,w决定)
grad 使用微分来选择mip的层,进行采样
1D纹理查找(几乎不用)
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层的一维纹理查找
ex1Dproj(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层的三维纹理查找
tex3Dproj(s, t) 把纹理当做一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询
立体纹理查找
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决定的某个MIP层偏置后的立方体纹理查找
texCUBEgrad(s,t,ddx,ddy) 使用微分并指定MIP层的立方体纹理查找
texCUBEproj(s,t) 使用投影方式的立方体纹理查找
#作业
1.写出你觉得最常用的5个函数
既然是常用,那基本上每个shader代码都会多多少少用到
mul函数 用于矩阵的相乘,这太普遍不过了,基本上所有的坐标空间转换都要用到
lerp函数 用于插值
dot函数/cross函数 点积和叉积
normalize(v) 向量进行归一化
tex2D函数 用于纹理贴图采样
2.ddx ddy的实际使用测试
上边说了,ddx 、ddy求的是 x、y方向上,相邻两个像素的某属性值的变化量
这也就是《GAMES101》中讲mipmap部分时说的,相邻像素(pixel)之间的距离(差值)对应到纹理(texel)中是多少距离。(看的教材多没坏处)
随便找个了采样贴图的shader,左边为正常采样的结果,作为对照
右边部分,shader中声明一个修改差值的系数Range,并在片元着色器中添加ddx ddy的部分。
![](https://i-blog.csdnimg.cn/blog_migrate/2de326822f9f6592331573953c46d2d8.jpeg)
具体效果请看视频(增加差值→边缘锐化的效果)