ํด๋น ์ด๋ฏธ์ง๋ dissolve ํจ๊ณผ๋ฅผ ์ ฐ์ด๋๋ก ๊ตฌํํ๊ฒ์ด๋ฉฐ
์ ฐ์ด๋๋ฅผ ์กฐ๊ธ๋ง ์ตํ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ ํจ๊ณผ์ ๋๋ค.
์์ฆ์ ์ธํฐ๋ํฐ๋ธ ์น, ๋ง์ดํฌ๋ก ์ธํฐ๋ํฐ๋ธ ๋ฑ UX๋ฅผ ์ํ ํจ๊ณผ๋ค์ด ์ค์ํด์ง๊ณ ์์ต๋๋ค.
๊ธฐ์กด canvas, css๋ก ํํํ๋ ํจ๊ณผ๋ฅผ shader๋ฅผ ํตํด ๊ทน๋ํ ์์ผ๋ด ์๋ค.
์ด๋ฐ ํจ๊ณผ๋ฅผ ๊ฐ๋ฐํ ์ ์๋ ๊ฐ๋ฐ์๊ฐ ๋ช์ด๋ ์์๊น์!?
๐คญ ๋๋ ์ธ์ ์ ๋ ๊ฒ ๋ฉ์๋ ํจ๊ณผ๋ฅผ ๊ตฌํํ์ง...
ํญ์ ์์๊ฒ, ๋ฉ์ง๊ฒ๋ฅผ ์ธ์น๋ ๊ธฐํ์์ ์์์ง๋ค์ ๋์ฆ๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ ์ํ GLSL ์๊ฐ์ ๋๋ค.
์ ๋ ์ฒ์์๋ ๋จธ๋ฆฟ์์ผ๋ก ์๊ฐ๋งํด๋ณด๊ณ ,
๋ฐฐ์์ผ์ง.. ๋ฐฐ์์ผ์ง.. ๐ฅ
ํ๋ฉด์ ์ง๋์ณ ์์ง๋ง ...
์ด ๊ธ์ ์ฝ์ผ์๋ ์ฌ๋ฌ๋ถ๋ค์ ๋ถ๋ ์ ์ฒ๋ผ ์ ฐ์ด๋์ ๋ํด์ ๋ชจ๋ฅธ์ฒํ๊ณ ์ง๋๊ฐ์ง๋ง์๊ณ ,
์ ๋ฐฐ์์ ์ฐ๋ด ๋ก์ ๊ฐ์ฆ์!
์ฝ๋๋ฅผ ์์ฑํ๊ธฐ์ ์ ๊ฐ๋จํ๊ฒ ๊ธฐ๋ณธ์ ์ธ ์ ฐ์ด๋๋ฅผ ์ดํดํฉ๋๋ค.
์ ฐ์ด๋์ Vertex Shader, Fragment Shader ... ์ฌ๋ฌ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋๋ฐ ์ด ๊ธ์์๋ Fragment Shader (ํฝ์ ์ ฐ์ด๋)์ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค.
์ ฐ์ด๋๋ ์์์ ๊ทธ๋ฆฌ๋ ํจ์์ธ๋ฐ ์ด ํจ์๊ฐ
ํฝ์ ๋ง๋ค ๋ชจ๋ ๋์์ ํธ์ถ ๋๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
์๊ฐํด๋ณด๋ฉด ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ๋ฎ์, ์๋ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ ์ ๋๋ค.
์ ฐ์ด๋์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
https://github.com/deeean/shader-starter-kit
์ ๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ shader-starter-kit ์ cloneํ์๊ณ ์์ํ์๋ฉด ๋ฉ๋๋ค~
yarn
yarn dev
์ ๋ด์ฉ์ ์ ๋ ฅํ๋ฉด webpack-dev-server๊ฐ ์คํ๋ฉ๋๋ค.
์ด๋ฐ ์ฌ๊ฐํ์ด ๊ทธ๋ ค์ง ํ๋ฉด์ด ๋์ต๋๋ค.
/src/shaders/fragmentShader.glsl ํ์ผ๋ก ์ด๋ํด์
precision highp float;
uniform vec2 u_resolution;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution;
gl_FragColor = vec4(vec3(uv.x), 1.0);
}
์ผ๋จ ๋ฌด์์ ์์ ๊ฐ์ด ์ ๋ ฅํด๋ด ์๋ค!
๊ฒ์์์์ ํฐ์์ผ๋ก ๊ทธ๋ผ๋ฐ์ด์ ์ด ์๊ฒผ๋ค์!?
๊ธ ์ด๋ฐ์ ๋งํ๊ฒ์ฒ๋ผ ์ ฐ์ด๋ ํจ์๋ ํฝ์ ๋ง๋ค ํจ์๊ฐ ์คํ๋๋ค๊ณ ํ์ต๋๋ค.
gl_FragCoord.xy
๋ ํ์ฌ ํฝ์
์ ์ขํ์ด๊ณ ๊ทธ ์ขํ๋ฅผ ํด์๋๋ก ๋๋์์ต๋๋ค.
0 ~ 512๊น์ง gl_FragCoord.xy์ ๊ฐ์ด ๋ค์ด์ค๊ณ ๊ทธ ์ขํ๋ฅผ ํด์๋๋ก ๋๋์์ผ๋
uv๋ผ๋ ๋ณ์๋ 0 ~ 1๊น์ง ์์์ ๋จ์๋ก ํํ๋ฉ๋๋ค.
์ ์ฌ์ง์ ์ฐธ๊ณ ํด์ ์ดํดํ๋ฉด ์ข์ต๋๋ค. (์ ํํ ์ด๋ ๊ฒ ๋์ํ๋๊ฒ์ ์๋๋๋ค.)
precision highp float;
uniform vec2 u_resolution;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution;
gl_FragColor = vec4(vec3(uv.y), 1.0);
}
uv.x ์๋ ์๋ฆฌ์ uv.y๋ฅผ ๋ฃ์ด ๋ด ์๋ค.
์ ์ผ ์๋์ชฝ๋ถํฐ ์ ๋ฐฉํฅ์ผ๋ก ๊ทธ๋ผ๋ฐ์ด์ ์ด ์๊ฒผ์ต๋๋ค.
์ด๋ฒ์๋ ๋๊ฐ์ ์ผ๋ก ๊ทธ๋ ค๋ณผ๊น์?
precision highp float;
uniform vec2 u_resolution;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution;
gl_FragColor = vec4(vec3(uv.x + uv.y), 1.0);
}
๋๊ฐ์ ์ผ๋ก ๊ทธ๋ ค์ก๋๋ฐ ๋ญ๊ฐ ์ด์ํ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ๊ฐํ์ ๋๊ฐ์ ๋ถ๋ถ์ ์ง๋๊ณ ๋ถํฐ๋ ์์์ด ๊ณ์ ํ์์์ ๋๋ค.
uv.x + uv.y๋ฅผ ๋ํ๋ฉด ์ต๋๊ฐ์ด 2.0์ด ๋ฉ๋๋ค.
๊ณฑํ๊ธฐ 0.5๋ฅผ ํ๋ฉด ์ต๋๊ฐ์ด 1.0์ด ๋๊ฒ ๋ค์?
precision highp float;
uniform vec2 u_resolution;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution;
gl_FragColor = vec4(vec3((uv.x + uv.y) * 0.5), 1.0);
}
precision highp float;
uniform vec2 u_resolution;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution;
float dist = distance(vec2(0.5), uv);
gl_FragColor = vec4(vec3(dist), 1.0);
}
๋ฐฉ์ฌํ ๋ชจ์์ ๊ทธ๋ผ๋ฐ์ด์ ์ด ์๊ฒผ์ต๋๋ค.
์ ๊ทธ๋ฐ์ง ์ดํด๋ด ์๋ค.
0.5, 0.5์ขํ๋ ์ค์์ด๊ณ
uv๋ ํฝ์ ๋ชจ๋ ๊ณณ
๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ๊ณ
ํ์ฌ ํฝ์ ์์น์ 0.5, 0.5์ ๊ฑฐ๋ฆฌ์ ์์ ๋ชจ๋ ํฝ์ ์ ๋ฃ์ด์ฃผ์์ต๋๋ค.
์ ์ด์ ์ ๋ช ํ ์์ ๋ง๋ค์ด๋ด ์๋ค.
precision highp float;
uniform vec2 u_resolution;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution;
float dist = distance(vec2(0.5), uv);
dist = step(0.5, dist);
gl_FragColor = vec4(vec3(dist), 1.0);
}
์์ฃผ ์ ๋ช ํ ์์ด ์๊ฒผ์ต๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด step์ด ์ถ๊ฐ๋์๋๋ฐ
// sample code
float step(float edge, float x) {
if (x < edge) {
return 0.0;
}
return 1.0;
}
๋ด๋ถ์ ์ผ๋ก ์์ ๊ฐ์ด ์๋ํฉ๋๋ค.
์์ฑ๋ ์ฝ๋์ step(0.5, dist) ๋ถ๋ถ์ ๋ณด๋ฉด
dist๊ฐ 0.5๋ณด๋ค ์์๋๋ 0.0 ํด๋๋ 1์ ๋ฐํํ๊ฒ ๋์ด์ ์ ๋ช ํ ์์ด ๋ฉ๋๋ค.
precision highp float;
uniform vec2 u_resolution;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution;
float dist = step(0.5, uv.x);
gl_FragColor = vec4(vec3(dist), 1.0);
}
uv.x๋ฅผ 0.5๋ก stepํ๋ฉด ์ด๋ฐ ๋ชจ์์ด๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ ฐ์ด๋ ์ดํด์ stepํจ์์ฌ์ฉ ๋ฐฉ๋ฒ๋ฑ์ ์์๋ณด์์ต๋๋ค.
๋ค์ ๊ฐ์์์๋ ์ ฐ์ด๋๋ฅผ ์กฐ๊ธ๋ ์ ์ฉํ๊ณ ๊ณ ๊ธ์คํฌ์ ์ฌ์ฉํด๋ด ์๋ค.
ํ์ฌ WE-AR์์ ์ฑ์ฉ์ ์งํํ๊ณ ์์ต๋๋ค.
์๋ ๋งํฌ๋ฅผ ํตํด ๋ง์ ์ง์ ๋ถํ๋๋ฆฝ๋๋ค.
์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค. ์ ๋ง ๊ตฌํํด๋ณด๊ณ ์ถ์ ํจ๊ณผ์์ด์. ๋๋ถ์ ํ๊ฐ์ง ๋ ๋ฐฐ์๊ฐ๋๋ค. ๋ค์๊ธ์ด ๊ธฐ๋ค๋ ค์ง๋ค์๐
wow