|
沙发
楼主 |
发表于 2023-12-27 14:30:04
|
只看该作者
// 原作者的所有噪声作品:
// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12
#版 450
同 粗二 外屏幕;
同 粗二 外鼠位;
同 逻二 外鼠按;
同 粗数 外时间;
/*这只是一个平平无奇的散列方法,你可以用更好的代替*/
粗二 哈希( 粗二 位置 ){
位置 = 粗二( 点积(位置,粗二(127.1,311.7)), 点积(位置,粗二(269.5,183.3)) );
返 -1.0 + 2.0*取小(正弦(位置)*43758.5453123);
}
粗数 噪声(粗二 位置 ){
/*我说的,极致优化部分,只需要知道跟这两相关的都是为了转换的*/
常 粗数 到钝 = 0.366025404; // (根(3)-1)/2;
常 粗数 到直 = 0.211324865; // (3-根(3))/6;
//原点:所在三角形的基准顶点。
粗二 原点 = 退整(位置 + 点积(位置,粗二(到钝)));
//点原:转回直角系后,所在三角形原点的坐标
粗二 点原 = 位置 - 原点 + 点积(原点,粗二(到直));
//所在:为了判断当前三角形在左还是右
//独点:当前位置所在三角形独有的顶点的相对于原点的坐标
///被注释掉的是原码,我觉得下面的更好理解
/// 粗数 所在 = 跃阶(点原.纵,点原.横);
/// 粗二 独点 = 粗二(所在,1.0-所在);
粗二 独点 =(0.0==跃阶(点原.纵,点原.横)?粗二(0,1)
:粗二(1,0));
//独点是三角独有点,(1,1)是三角共有点
粗二 点独 = 点原 - 独点 + 到直;
/// 点独 = 点原 - 独点 + 点积(独点,到直)
粗二 点共 = 点原 - 1.0 + 2.0*到直;
/// 点共 = 点原 - 1.0 + 点积(粗二(1),到直)
//0.5是全等三角形的一个顶点到对边最短的距离吧。
//此计算下的三角形最长边为1,用0.5可以把顶点对所有点的影响权重框定在[0,0.5]中
粗三 距权 = 较大(0.5-粗三(点积(点原,点原),
点积(点独,点独),
点积(点共,点共)),0.0);
//上面的是衰减方法,如果不用的话,我们会得到一堆三角形
//参数一的这几个点,应该是对应点的距离权重(点积)
//参数二的则是计算对应点的随机数
粗三 噪 = 距权*距权*距权*距权;
噪 *= 粗三(点积(点原,哈希(原点+0.0)),
点积(点独,哈希(原点+独点)),
点积(点共,哈希(原点+1.0)));
返 点积(噪, 粗三(70.0));
}
无 主(){
粗二 位置 = 像位置.横纵 / 外屏幕.横纵;
/*前半为了使画出的图像为正方形,后为了使图像动态移动*/
粗二 坐标 = 位置*粗二(外屏幕.横/外屏幕.纵,1.0) + 外时间*0.25;
粗数 结果 = 0.0;
若( 位置.横<0.6 ){
// 左图:单个值噪声
结果 = 噪声( 16.0*坐标 );
}则{
// 右图:分形噪声(基于四个值噪声)//本身就可开一门的东西,以后可能讲吧
坐标 *= 5.0;
阵二 m = 阵二( 1.6, 1.2, -1.2, 1.6 );
结果 = 0.5000*噪声( 坐标 ); 坐标 = m*坐标;
结果 += 0.2500*噪声( 坐标 ); 坐标 = m*坐标;
结果 += 0.1250*噪声( 坐标 ); 坐标 = m*坐标;
结果 += 0.0625*噪声( 坐标 );
}
结果 = 结果*0.5 + 0.5;//为了把值限制在[-0.5,0.5]
结果 *= 线阶( 0.0, 0.005, 取正(位置.横-0.6));//这里是为了画黑线
像颜色 = 粗四( 结果, 结果, 结果, 1.0 );
} |
|