0

我一直在研究单工噪声的实现,在值求和期间没有分支。

几乎一切都运行顺利,我唯一遇到的问题是由于一些人工制品,可以看到单纯形晶格。这些伪影来自权重的计算方式:开始时,我从着色器手册中获取了一些代码:噪声

带有少量伪影的噪声

带有少量伪影的噪声(当前状态)

夸张的文物

带有夸张伪影的噪音(故意让您可以清楚地看到问题)

   //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 中的代码: 代码截图

如果您想自己尝试,这里是整个着色器的链接。

4

0 回答 0