
๐ ํ ์ค์ฒ ์ขํ (uv) ์ผ์ ํ ๊ฐ๊ฒฉ์ Grid๋ก ๋ณํ
๋ ธ๋๋ฅผ ํตํ ๊ตฌํ๊ณผ ์ฝ๋๋ฅผ ํตํ ๊ตฌํ ๋น๊ต


//HLSL
float2 uvGrid = floor(uv * 5.0);
return uvGrid;
floor ํจ์๋ ์์์ ์ ๋ฒ๋ฆฌ๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ํํ ์ ์๋ก ๋ณํํ๋ค. uv๊ฐ (1.3, 2.7)์ด๋ผ๋ฉด floor(1.3)์ 1์ด ๋๊ณ , floor(2.7)์ 2๊ฐ ๋๋ค.

//HLSL
int gridArray[5][5] = {{ 0, 0, 0, 0, 0},
{ 0, 1, 0, 1, 0},
{ 0, 0, 0, 0, 0},
{ 0, 1, 1, 1, 0},
{ 0, 0, 0, 0, 0},};
float2 uvGrid = floor(uv *5.0);
return (gridArray[int(uvGrid.y)]
[int(uvGrid.x)]);
gridArray 5x5ํฌ๊ธฐ์ 2D ์ ์ ๋ฐฐ์ด์ด๋ค. ๋ฐฐ์ด์ ๊ฐ ์์๋ 0 ๋๋ 1๋ก ์ด๊ธฐํ ๋์ด์๋ค. floor(uv*5.0) ์ขํ์ ๋ฐ๋ผ ๊ฐ ์ ์ ๊ฐ์ ๊ฐ์ ธ์ 1์ขํ ๊ฐ์ ๋ํด ํ์ดํธ(1), ๋ธ๋(0)๋ก ์ฒ๋ฆฌํ๋ค.
๐ Pixel effect w.Texture


//HLSL
float2 gridSize = float2(24,24);
float2 uvGrid = floor(uv * gridSize) / gridSize;
float3 result = Texture2DSample(tex, texSampler, uvGrid);
//grayscale ๋ณํ ๋ฐ ๋ฐํ
return float(dot(result, float3(.299, .587, .114)));
gridArray ๋์ float2 ํํ์ gridSize๋ก ๋ฐ๊ฟจ๋ค. return์ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฌผ์ด grayscale์ด๊ธฐ ๋๋ฌธ์ r,g,b๊ฐ ํ์์ผ๋ก ๊ตฌํ๋ ์ ์๋ ๊ฐ์ ๊ณฑํ๋ค. ๋ค๋ฅธ ๊ฐ์ ๊ณฑํ๋ ์ด์ ๋ r,g,b ์ปฌ๋ฌ๋ง๋ค ๋ฐ๊ธฐ์ ๋ํ ๋ฏผ๊ฐ๋๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์นํ ๋ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ.
- uv๋ ํ ์ค์ฒ ์ขํ๋ก, ์ผ๋ฐ์ ์ผ๋ก (0.0, 0.0)์์ (1.0, 1.0) ๋ฒ์ ๋ด์ ๊ฐ์ ๊ฐ์ง๋ค.
- uv * gridSize๋ ํ ์ค์ฒ ์ขํ๋ฅผ ๊ทธ๋ฆฌ๋ ํฌ๊ธฐ๋งํผ ํ๋ํ๋ค. ์๋ฅผ ๋ค์ด, uv๊ฐ (0.5, 0.5)๋ผ๋ฉด uv * gridSize๋ (12, 12)๊ฐ ๋๋ค.
- floor(uv * gridSize)๋ ํ๋๋ ์ขํ๋ฅผ ํํ ์ ์๋ก ๋ณํํ์ฌ ๊ทธ๋ฆฌ๋ ์ ์ ์ขํ๋ฅผ ๋ง๋ ๋ค. ์๋ฅผ ๋ค์ด, (12.7, 13.3)์ (12, 13)์ด ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก / gridSize๋ฅผ ํตํด ๋ค์ 0.0์์ 1.0 ์ฌ์ด์ ํ ์ค์ฒ ์ขํ๋ก ์ ๊ทํํ๋ค. ์๋ฅผ ๋ค์ด, (12, 13)์ (12/24, 13/24) = (0.5, 0.5417)์ด ๋๋ค.
- dot(result, float3(.299, .587, .114)) ํฝ์ ์ ์ค์ ์๊ฐ์ ๋ฐ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค. ์ฆ ํ๋ฐฑํํ๋ ๊ฒ.
๐ ๊ฐ ํฝ์ ์ฃผ์์ ์ฃ์ง ๋ฃ๊ธฐ (borderThickness)
ํ ์ค์ฒ ์ขํ๋ฅผ ์ผ์ ํ ๊ทธ๋ฆฌ๋ ํฌ๊ธฐ๋ก ๋ณํํ๊ณ , ๊ทธ๋ฆฌ๋ ๊ฒฝ๊ณ ์์ญ์ ๊ฐ์กฐํ๋ค. ๊ฐ ๊ทธ๋ฆฌ๋ ๋ธ๋ญ์ ์ฃ์ง ๋ด์ ์๋ ํฝ์ ์ ์ ์งํ๊ณ ์ฃ์ง ์ธ๋ถ์ ์๋ ํฝ์ ์ ์ ๊ฑฐํ๋ค.


//HLSL
float2 uvGrid = floor(uv * gridSize) / gridSize;
float2 gridBlock = 1 / gridSize;
//๊ทธ๋ฆฌ๋ ๋ธ๋ก์ ํ
๋๋ฆฌ ๋๊ป ์ค์
float borderThickness = 0.25;
//๊ทธ๋ฆฌ๋ ์ฃ์ง ๊ณ์ฐ
float2 blockBorder = step(0.5 - borderThickness, frac(uv / gridBlock)) *
step(frac(uv / gridBlock), 0.5 + borderThickness);
//uvGrid ์ขํ์์ ํ
์ค์ฒ ์์ ๊ฐ์ ์ํ๋งํ๋ค
float3 result = Texture2DSample(tex, texSampler, uvGrid);
//๋ธ๋ก์ ์ฃ์ง ๋ถ๋ถ์์๋ง ํ
์ค์ฒ ์์์ด ๋ํ๋๋๋ก ํจ
//์ฃ์ง ๋ฐ ์์ญ์ ๊ฒ์์(0)
result *= float(blockBorder.x * blockBorder.y);
return float(dot(result, float3(.299, .587, .114)));
gridSize๋ float2 ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๊ธฐํ ์ฝ๋๋ ์๋ตํ๋ค. ์ ๋ณ์ gridBlock์ gridSize๋ก ๋๋์ด ๊ฐ ๋ธ๋ก์ ํ ์ค์ฒ์ 1/24 ํฌ๊ธฐ์ด๋ค.
- frac ํจ์๋ ์์ ๋ถ๋ถ์ ์ทจํ์ฌ [0.0, 1.0]๋ฒ์๋ก ๋ง๋ ๋ค.
- step ํจ์๋ ๋ ๊ฐ ๊ฐ์ ๋น๊ตํ์ฌ Edge๋ฅผ ํ์ฑํ๋ค. step(edge, x)๋ x๊ฐ edge๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด 1.0, ๊ทธ๋ ์ง ์์ผ๋ฉด 0.0์ ๋ฐํํ๋ค.
- ๋ step ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ณฑํ์ฌ Edge ์์ญ์ ์ ์ํ๋ค. Edge ์์ญ์ ๊ทธ๋ฆฌ๋ ๋ธ๋ก์ ์ค์ฌ์ ๊ธฐ์ค์ผ๋ก 0.5 - borderThickness์์ 0.5 + borderThickness ์ฌ์ด์ ์์นํ๋ค.

//HLSL
//๋
ธ์ด์ฆ ์์ฑ
struct pixelPlot
{
float noise(float2 uvCoord)
{
return frac(sin(dot(uvCoord, float2(12.34, 56.78))) * 91011.1213);
}
};
//pixelPlot ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค ์์ฑ
pixelPlot plot;
float2 uvGrid = floor(uv * gridSize) / gridSize;
float2 gridBlock = 1 / gridSize;
float borderThickness = 0.25;
float2 blockBorder = step(0.5 - borderThickness, frac(uv / gridBlock)) *
step(frac(uv / gridBlock), 0.5 + borderThickness);
float3 result = Texture2DSample(tex, texSampler, uvGrid);
result *= float(blockBorder.x * blockBorder.y);
//ํ์ฌ ํฝ์
์ ๋ฐ๊ธฐ๊ฐ 0๋ณด๋ค ํฌ๋ค๋ฉด, ์ฆ ๊ฒ์ ์ด ์๋๋ผ๋ฉด ๋
ธ์ด์ฆ๋ฅผ ์ถ๊ฐ
if (dot(result, float3(.299, .587, .114)) > 0.0)
{
//๊ฐ ๋
ธ์ด์ฆ ๊ฐ์ ์์์ ์คํ์
์ ๋ํด ์ฐจ์ด๋ฅผ ์ค
result = float3(plot.noise(uvGrid +frac(1.23)),
plot.noise(uvGrid +frac(4.56)),
plot.noise(uvGrid +frac(7.89)));
}
return result;
๊ตฌ์กฐ์ฒด struct pixelPlot์ 2D์ขํ(uvCoord)๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋์ ๋ ธ์ด์ฆ ๊ฐ์ ์์ฑํ๋ค. dot์ ๋ ๋ฒกํฐ์ ๋ฐฉํฅ๊ณผ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋จ์ผ ์ค์นผ๋ผ ๊ฐ์ ์์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ sin ํจ์์ ์ ์ฉํ ํ ํฐ ์ซ์๋ฅผ ๊ณฑํด ์ดํ ์ฐ์ฐ์์ ๋ ธ์ด์ฆ๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค. ๊ทธ๋ฆ๊ณ frac์ผ๋ก ์ ๋ ฅ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ก ์ ํํ๋ค.
- dot(result, float3(.299, .587, .114)): ํฝ์ ์ ๋ฐ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๊ธฐ๋ฅผ ๊ณ์ฐํ ๋ ์ฌ์ฉ๋๋ ๊ฐ์ค์น์ด๋ค.
๐ Time ์ถ๊ฐํ์ฌ ๋ฌด์์ ํฝ์ ์ปฌ๋ฌ ๋ณํ๊ธฐ

result = float3(plot.noise(uvGrid +frac(time/1.23)),
plot.noise(uvGrid +frac(time/4.56)),
plot.noise(uvGrid +frac(time/7.89)));
time์ ๋ฃ์ด์ ๋ฌด์์๋ก ํฝ์ ์ปฌ๋ฌ๊ฐ ๋ณํ๊ฒ ํ ์๋ ์๋ค.
๐ Ref.
https://www.youtube.com/watch?v=0fnHLMp0m7k
'HLSL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HLSL ๋ฐ์ดํฐ ํ์ Struct (0) | 2024.12.12 |
---|---|
๋ฃจํ ํจํด ๋ง๋ค๊ธฐ (0) | 2024.10.29 |
์ ๊ทธ๋ฆฌ๊ธฐ + ํ์ผ๋ง (0) | 2024.10.28 |