基于Voronoi模式计算法线

问题描述 投票:0回答:1

我正在将3D Voronoi图案应用到网格上。使用这些循环,我能够计算像元位置,id和距离。

但是我想根据生成的模式计算法线。如何基于此模式和相关单元生成法线或重定向当前法线?

目的是为网格提供正面外观。每个像元的法线应指向同一方向,相邻像元的法线应指向不同的方向。这些方向应基于原始的网格法线,我不想完全破坏网格法线并使这些点位于随机方向。

这是我生成Voronoi模式的方式。

float3 p = floor(position);
float3 f = frac(position);
float id = 0.0;
float distance = 10.0;

for (int k = -1; k <= 1; k++)
{
    for (int j = -1; j <= 1; j++)
    {
        for (int i = -1; i <= 1; i++)
        {
            float3 cell = float3(float(i), float(j), float(k));
            float3 random = hash3(p + cell);
            float3 r = cell - f + random * angleOffset;
            float d = dot(r, r);

            if (d < distance)
            {
                id = random;
                distance = d;
                cellPosition = cell + p;
                normal = ?
            }
        }
    }
}
opengl directx shader voronoi normals
1个回答
0
投票

这看起来像是相当昂贵的片段着色器,烘烤法线贴图比尝试实时地做更有意义。

很难说出您的着色器在做什么,但我认为它是根据3x3的voronoi细胞网格检查每个像素的。一件奇怪的事情是random是以某种方式分配给vec3id,它只是一个标量。

无论如何,听起来您想通过随机矢量来扰动网格提供的法线,但是您希望以相同的方式来扰动与特定voronoi单元相对应的所有像素。

由于您已经有了一个名为random的变量,该变量可能表示根据voronoi细胞确定性生成的随机值,因此您可以使用它。例如,以下内容会干扰法线少量:

normal = normalize(meshNormal + 0.2 * normalize(random));

如果要赋予随机分量更多的权重,只需增加0.2常数。

© www.soinside.com 2019 - 2024. All rights reserved.