hcwanz 发表于 2024-1-6 22:31:26

[着色.源码]波普着色器

本帖最后由 hcwanz 于 2024-1-6 22:33 编辑

    学了这么多理论了,本篇我们讲一个应用级的着色器。

    上面的图像可以划分为四个组成:饼基、高光、逆衰减、中洞。
    其中的饼基是一个不规则的圆,原理是:
一,先通过噪声算法计算出每个点的随机值。(所用的噪声先不讲了,好像直接照搬的)
二,然后用随机值,打乱圆半径,得到不规则的饼。
三,然后通过光计算,衰减饼值,越接近饼半径的饼基越接近一,越远离的越接近零。
四,清零大于饼半径的点。

不进行第四步,则是下图

    高光是在饼边缘的一个月牙,原理是:
一,通过时间和三角函数,计算出高光中心点在饼边缘的位置。
二,通过光计算,在中心点画出一个光圆。
三,通过光计算,将高光圆削减为高光牙。

    逆衰减和洞没啥复杂的就不讲了:

核心代码:


hcwanz 发表于 2024-1-6 22:32:05

#版 450
同 粗二 外屏幕;
同 粗二 外鼠位;
同 粗二 外鼠按;
同 粗数 外时间;
//噪声方法原址:https://www.shadertoy.com/view/4sc3z2
//本方法原址:https://www.shadertoy.com/view/3tBGRm
粗三 散列33(粗三 p3){
    p3 = 取小(p3 * 粗三(.1031,.11369,.13787));
    p3 += 点积(p3, p3.纵横深+19.19);
    返 -1.0+2.0 * 取小(粗三(p3.横+p3.纵, p3.横+p3.深, p3.纵+p3.深)*p3.深纵横);
}
粗数 分形噪声三(粗三 p){
    常 粗数 K1 = 0.333333333;
    常 粗数 K2 = 0.166666667;

    粗三 i = 退整(p + (p.横+p.纵+p.深) * K1);
    粗三 d0 = p - (i - (i.横+i.纵+i.深) * K2);

    粗三 e = 跃阶(粗三(0.0), d0 - d0.纵深横);
    粗三 i1 = e * (1.0 - e.深横纵);
    粗三 i2 = 1.0 - e.深横纵 * (1.0 - e);

    粗三 d1 = d0 - (i1 - K2);
    粗三 d2 = d0 - (i2 - K1);
    粗三 d3 = d0 - 0.5;

    粗四 h = 较大(0.5 - 粗四(点积(d0, d0), 点积(d1, d1),
                           点积(d2, d2), 点积(d3, d3)),
                  0.0);
    粗四 n = h * h * h * h
            *粗四(点积(d0, 散列33(i)),
                  点积(d1, 散列33(i + i1)),
                  点积(d2, 散列33(i + i2)),
                  点积(d3, 散列33(i + 1.0)));
    返 点积(粗四(31.316), n);
}
/*将最大的颜色值作为混合值,同时将所有的颜色值限制在之间*/
粗四 提取特值(粗四 入色){
    粗数 较大值 = 较小(较大(较大(入色.红, 入色.绿), 入色.蓝), 1.0);
    若 (较大值 > 1e-5){
      返 粗四(入色.横纵深/较大值,较大值);
   }则{ 返 粗四(0);}
}
/*强度最多一点几就行;距原名是dist*/
粗数 光一(粗数 强度, 粗数 衰减, 粗数 距)
{   返 强度 / (1.0 + 距 * 衰减);}
粗数 光二(粗数 强度, 粗数 衰减, 粗数 距)//距>1的时候光强于光一,
{   返 强度 / (1.0 + 距 * 距 * 衰减);}//距<1的时候光弱于光一。

无 主(){
常 粗四 色一 = 粗四(0.6, 0.26, 0.996,0.0);
常 粗四 色二 = 粗四(0.298, 0.76, 0.9,0.0);
常 粗四 色三 = 粗四(0.0627, 0.078, 0.6,0.0);
常 粗四 背景 = 粗四(0.0);
常 粗数 内径 = 0.6;//innerRadius

    粗二 位置 = (像位置.横纵*2.0-外屏幕)/外屏幕.纵;
///上面是自下面优化而来。
///    位置 = 像位置/外屏幕;//将坐标值转为易于计算的单位坐标
///    位置 = 位置*2.0-粗二(1);//将原点设为画布中心
///    位置.横*=外屏幕.横/外屏幕.纵;//使画出的图像永远为正,即使画布不正

    粗数 角 = 反正切(位置.纵, 位置.横);
    粗数 长 = 长度(位置);
    粗数 饼基, 高光, 逆衰, 空洞, 色比;
    粗数 径值, 距值, 噪值;
////// 饼
    噪值 = 分形噪声三(粗三(位置 * 0.65, 外时间)) * 0.5 + 0.5;
//用噪基混合内径,根据噪基的不同,获得的值不同
///感觉没太大差别
///    径值 = 混合(混合(内径, 1.0, 0.4), 混合(内径, 1.0, 0.6), 噪值);
    径值 = 混合(内径+0.1,内径+0.2,噪值);
//径值是一个具有长度和方向的向量,除长,去掉了径值的长度,//不全对
//将只有方向的径值与位置相乘,得到当前噪声值对位置的影响。
//然后用距离方法,得到具体的影响值。
    距值 = 距离(位置, 径值 / 长 * 位置);//径值和距值越接近这里越小
    饼基 = 光一(1.0, 10.0, 距值);//距值越小,饼基越大
    饼基*= 线阶(径值 * 1.05, 径值, 长);//大于径值(超出内径)点的返回零
    色比 = 余弦(角 + 外时间 * 2.0) * 0.5 + 0.5;
////// 高光
    粗数 a = 0.0-外时间;//让高光旋转方向和饼旋转方向相同
    粗二 坐标 = 粗二(余弦(a), 正弦(a)) * 径值;//高光的圆心位置
    高光 = 光二(1.5, 5.0, 距离(位置, 坐标));//画一个光圆
    高光*= 光一(1.0, 50.0 , 距值);//对光圆进行衰减
////// 反向衰减
    逆衰 = 线阶(1.0, 混合(内径, 1.0, 噪值 * 0.5), 长);
////// 洞//hole
    空洞 = 线阶(内径, 内径+0.2, 长);
////// 色
    粗四 颜色 = 混合(色一, 色二, 色比);//混合色一、二、三
    颜色 = 混合(色三, 颜色, 饼基);
    颜色 = (颜色 + 高光) * 逆衰 * 空洞;//组合四个组成
///    颜色=粗四(高光);//可以在这里依次试试饼基、高光… …
    颜色 = 限制(颜色, 0.0, 1.0);//将颜色限制在
    颜色 = 提取特值(颜色);

    像颜色= 混合(背景, 颜色, 颜色.特); //正常混合
}

猕猴桃 发表于 2024-1-6 23:31:26

厉害,支持。

shuimiao 发表于 2024-1-7 10:07:37

这又是哪个中文编程的IDE?

hcwanz 发表于 2024-1-7 10:38:51

本帖最后由 hcwanz 于 2024-1-7 11:23 编辑

shuimiao 发表于 2024-1-7 10:07
这又是哪个中文编程的IDE?
是cmd终端:噜阿噜
页: [1]
查看完整版本: [着色.源码]波普着色器