|
沙发
楼主 |
发表于 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);
}
/*将最大的颜色值作为混合值,同时将所有的颜色值限制在[0,1]之间*/
粗四 提取特值(粗四 入色){
粗数 较大值 = 较小(较大(较大(入色.红, 入色.绿), 入色.蓝), 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);//将颜色限制在[0,1]
颜色 = 提取特值(颜色);
像颜色= 混合(背景, 颜色, 颜色.特); //正常混合
} |
|