์šฐ์„  ๋‚ด๊ฐ€ ๋ณด๋ฉด์„œ ๋”ฐ๋ผํ•œ ์ฝ”๋“œ๋Š” ์—ฌ

ย 

Daniel Ilett ์ฑ„๋„์˜ย Voronoi-based Lava in Unity Shader Graph
https://์œ ํŠœ๋ถ€/pFQ2-HFG_hY?si=N41ho8Y-ke_O5xYV


ํ•œ์ค„ํ•œ์ค„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•˜๋‹ค๊ฐ€ ๋จธ๋ฆฌ ๋œจ๊ฑฐ์›Œ์ ธ์„œ ๊ทธ๋ƒฅ ์ƒ์งœ๋กœ ์˜ฌ๋ฆด๊ฒŒ

ํŒŒ์ผ๋ช…, CustomVoronoi.hlsl


inline float2 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.4 + 0.5, cos(UV.x * offset) * 0.4 + 0.5);ย 

}


// Based on code by Inigo Quilez: https://iquilezles.org/articles/voronoilines/

void CustomVoronoi_float(float2 UV, float AngleOffset, float CellDensity, out float DistFromCenter, out float DistFromEdge, out float myDEBUG)

{

ย  ย  int2 gridPos = floor(UV * CellDensity);

ย  ย  float2 detailedPos = frac(UV * CellDensity);


ย  ย  DistFromCenter = 8.0f;

ย  ย  float2 closestOffset = float2(0, 0);


ย  ย  for (int y = -1; y <= 1; ++y)

ย  ย  {

ย  ย  ย  ย  for (int x = -1; x <= 1; ++x)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย ย float2ย checkingDir =ย float2ย (x, y);

ย  ย  ย  ย  ย  ย  float2 cellOffset =ย checkingDirย - detailedPos + randomVector(checkingDir + gridPos, AngleOffset);

ย  ย  ย  ย  ย  ย  float2 cellOffset =ย checkingDirย + randomVector(checkingDir + gridPos, AngleOffset)ย - detailedPos;

ย  ย  ย  ย  ย  ย  float distToPoint = dot(cellOffset, cellOffset);


ย  ย  ย  ย  ย  ย  if (distToPoint < DistFromCenter)

ย  ย  ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ย  ย  DistFromCenter = distToPoint;

ย  ย  ย  ย  ย  ย  ย  ย  closestOffset = cellOffset;

ย  ย  ย  ย  ย  ย  }

ย  ย  ย  ย  }

ย  ย  }


ย  ย  float2 secV2 = float2(0, 0);


ย  ย  DistFromEdge = 8.0f;

ย  ย  for (int y = -1; y <= 1; ++y)

ย  ย  {

ย  ย  ย  ย  for (int x = -1; x <= 1; ++x)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย ย float2ย checkingDir =ย float2ย (x, y);

ย  ย  ย  ย  ย  ย  float2 cellOffset =ย checkingDir+ randomVector(checkingDir + gridPos, AngleOffset) - detailedPos;

ย  ย  ย  ย  ย  ย  float distToEdge = dot(0.5f * (closestOffset + cellOffset), normalize(cellOffset - closestOffset));


ย  ย  ย  ย  ย  ย  DistFromEdge = min(DistFromEdge, distToEdge);

ย  ย  ย  ย  }

ย  ย  }


ย  ย  myDEBUG = 0;

}


์น ํ•œ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ž„ ๋นจ๊ฐ„์ƒ‰์€ ๋ฐ์ดํ„ฐ ์ž˜ ๋Œ์•„๊ฐ ํŒŒ๋ž€์ƒ‰์€ ์ด์ƒํ•˜๊ฒŒ ๊ณ„์‚ฐย 

ํ•˜ ์‹œ๋ฐœ ์ปดํ„ฐ ๊ป๋‹ค ์ผœ๋ด์•ผ๊ฒ ๋‹ค