我正在将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 = ?
}
}
}
}
这看起来像是相当昂贵的片段着色器,烘烤法线贴图比尝试实时地做更有意义。
很难说出您的着色器在做什么,但我认为它是根据3x3的voronoi细胞网格检查每个像素的。一件奇怪的事情是random
是以某种方式分配给vec3
的id
,它只是一个标量。
无论如何,听起来您想通过随机矢量来扰动网格提供的法线,但是您希望以相同的方式来扰动与特定voronoi单元相对应的所有像素。
由于您已经有了一个名为random
的变量,该变量可能表示根据voronoi细胞确定性生成的随机值,因此您可以使用它。例如,以下内容会干扰法线少量:
normal = normalize(meshNormal + 0.2 * normalize(random));
如果要赋予随机分量更多的权重,只需增加0.2
常数。