Voronoi ノード
説明
入力 UV に基づいて、ボロノイノイズ (Worley ノイズ) を生成します。ボロノイノイズは各点のピクセルとラティスとの間の距離を計算することで生成されます。これらの点を入力 Angle Offset によって制御される疑似乱数でオフセットすることで、セルのクラスターの生成が可能になります。セルのスケールと結果のノイズは入力 Cell Density によって制御されます。出力 Cells にはセルの RAW データが含まれます。
ポート
Name | Direction | タイプ | バインディング | 説明 |
---|---|---|---|---|
UV | 入力 | Vector 2 | UV | 入力 UV 値 |
Angle Offset | 入力 | Vector 1 | なし | 点のオフセット値 |
Cell Density | 入力 | Vector 1 | なし | 生成されるセルの密度 |
Out | 出力 | Vector 1 | なし | 出力されるノイズの値 |
Cells | 出力 | Vector 1 | なし | セルの RAW データ |
生成されるコードの例
以下のサンプルコードは、このノードの出力の一例を示したものです。
inline float2 unity_voronoi_noise_randomVector (float2 UV, float offset)
{
float2x2 m = float2x2(15.27, 47.63, 99.41, 89.98);
UV = frac(sin(mul(UV, m)) * 46839.32);
return float2(sin(UV.y*+offset)*0.5+0.5, cos(UV.x*offset)*0.5+0.5);
}
void Unity_Voronoi_float(float2 UV, float AngleOffset, float CellDensity, out float Out, out float Cells)
{
float2 g = floor(UV * CellDensity);
float2 f = frac(UV * CellDensity);
float t = 8.0;
float3 res = float3(8.0, 0.0, 0.0);
for(int y=-1; y<=1; y++)
{
for(int x=-1; x<=1; x++)
{
float2 lattice = float2(x,y);
float2 offset = unity_voronoi_noise_randomVector(lattice + g, AngleOffset);
float d = distance(lattice + offset, f);
if(d < res.x)
{
res = float3(d, offset.x, offset.y);
Out = res.x;
Cells = res.y;
}
}
}
}