我一直在研究单工噪声的实现,在值求和期间没有分支。
几乎一切都运行顺利,我唯一遇到的问题是由于一些人工制品,可以看到单纯形晶格。这些伪影来自权重的计算方式:开始时,我从着色器手册中获取了一些代码:噪声。
带有少量伪影的噪声
带有少量伪影的噪声(当前状态)
夸张的文物
带有夸张伪影的噪音(故意让您可以清楚地看到问题)
//don't know how this works
vec3 simplexGrid (vec2 st) {
vec3 xyz = vec3(0.0);
vec2 p = fract(skew(st));
if (p.x > p.y) {
xyz.xy = 1.0-vec2(p.x,p.y-p.x);
xyz.z = p.y;
} else {
xyz.yz = 1.0-vec2(p.x-p.y,p.y);
xyz.x = p.x;
}
return fract(xyz);
}
这个函数返回每个角的影响,通过使用它作为权重的基础,然后得到它们的平方值以平滑它们,我使用与他的三平面映射技术相同的技巧 sabastian lague 并简单地将它们除以它们的总和。这样我就不必使用五次平滑功能。
这种方法有两个问题:
- 刚才说的文物。
- frac函数的使用
为了解决它们(同样,几乎解决了第一个问题),我使用了一个类似于 arduino 的 map 函数的 map 函数(与数组没有任何关系)。
map(float val, float min, float max){return (val-min)/(max-min);}
通过手动搜索每个重量的最小值和最大值,我读取了压裂并大大减小了人工制品的大小。但这仍然不够,因为人工制品在地形网格上更加明显。我很确定问题出在我想出的最小值和最大值上。因此,如果你们中的任何人有任何建议或问题来摆脱这些人工制品,请随时发布以下是 HLSL 中的代码: 代码截图
如果您想自己尝试,这里是整个着色器的链接。