欢迎使用CSDN-markdown编辑器

来源:互联网 发布:淘宝墙贴 编辑:程序博客网 时间:2024/06/11 12:12

【The Book of Shaders】学习笔记(一)

1. 造型函数

y = mod(x,0.5); // 返回 x 对 0.5 取模的值
y = fract(x); // 仅仅返回数的小数部分
y = ceil(x); // 向正无穷取整
y = floor(x); // 向负无穷取整
y = sign(x); // 提取 x 的正负号
y = abs(x); // 返回 x 的绝对值
// 把 x 的值限制在 0.0 到 1.0
//如果x小于0,返回0。如果x大于1,返回1,否则返回x 。

y = min(0.0,x); // 返回 x 和 0.0 中的较小值
y = max(0.0,x); // 返回 x 和 0.0 中的较大值
y = pow(x,5.0); //返回x的5次方
y =exp(x); //返回e的x次方
y = step(0.5,x); // x<0.5返回0.0 x>0.5返回1.0
y = smoothstep(0.1,0.9,x);
//参数分别是min, max,x;smoothsetp()进行的计算是
// t = clamp((x -min) / (max - min), 0.0, 1.0);
// return t * t * (3.0 - 2.0 * t);

这一章的后半部分还链接了很多扩展的造型函数,都是英文网页,我按照自己的理解翻译学习了一下。

“Iñigo Quiles 收集了一套有用的函数”

1
假设你不想改变映射后的数值,除非它真的太小了影响了计算,那么你可以用阈值来平缓调节(比如三次多项式)而不是采用分情况的条件计算。m表示阈值(任何大于M的值都会保持不变),n表示变量值为0时的常数值。通过以下四个式子可以解出三次多项式的表达式p(x) = (2n-m)(x/m)^3 + (2m-3n)(x/m)^2 + n

这里写图片描述
这个函数更适合用来应用于射击或音乐或者动画片的专辑封面(???可能意思是像物体被抛出的轨迹和声波???)以及任何增长很快而下降的慢的东西。k用来表示函数拉伸程度。函数在x = 1/k时达到最大值1.0
这里写图片描述                                                  这里写图片描述
y = impulse(5.,.x);                                                                                      y = impulse(12.,.x);

这里写图片描述
你会发现自己经常用到 smoothstep(c-w,c,x)-smoothstep(c,c+w,x),可能你会试着分离出一些特点来(??不懂)cubicPulse()可以很好的帮到你。同样它也可以用来简单模仿高斯函数。
这里写图片描述  这里写图片描述  这里写图片描述
y = cubicPulse(0.5,0.2,x);                             y = cubicPulse(0.3,0.5,x);                             y = cubicPulse(0.5,0.5,st.x);
这里写图片描述
一种常见的减函数是指数级的线性减少量(啥啥啥这是啥)。黄色的曲线(蓝色??)是exp( -x ) 的曲线 。高斯函数是指数级的二次减少,exp(-x²) ,图中的亮绿色曲线(好吧我承认我也找不出到底是哪个这个是高斯函数这个是高斯函数表达式)。你可以试着增大幂级(就是pow()的参数n),得到更陡峭的smoothstep( ),幂级足够大时图像就会接近step( )的图像。
这里写图片描述   这里写图片描述    这里写图片描述
y = expStep(x,10.0,4.0);                                  y = expStep(x,10.0,24.0);                             y = expStep(x,44.0,4.0);
这里写图片描述
gain( )函数可以把一组等间距的直线重映射成两端分散中间压缩的图像,并保持0.5依旧映射到0.5处。这在Renderman 着色语言(Renderman Shading Language )里是个常用的函数。k=1时的函数是个分界,k<1的图像就是我们平时所常见的,k>1则是“S”型。k=a与k=1/a的图像是关于k=1对称的。
这里写图片描述                                 这里写图片描述
y = gain(x, 2.0);                                                                        y = gain(x, 0.5);
这里写图片描述
这个函数建立的映射是两端值为0。中间处的映射值为1。
这里写图片描述             这里写图片描述             这里写图片描述
y = parabola(x,0.5);                                          y = parabola(x,1.0);                                          y = parabola(x,4.0);
这里写图片描述
若使两端映射到0可以使用这个函数。它也很适合用来做树叶、眼睛等其他有趣的造型。
这里写图片描述          这里写图片描述          这里写图片描述
y = pcurve(x, 1.0,2.4);                                   y = pcurve(x, 1.0,3.8);                                   y = pcurve(x, 3.8,2.4);

原创粉丝点击