์ค๋์ ๋๋์ด ์ ฐ์ด๋์์ ์์ง๋ฐฐ๊ธฐ ์ ๋ณด๋ผ๊ณ ํ ์ ์๋ Fragment ์ ฐ์ด๋์ ๋ํด์ ์์๋ณผ๊บผ์ผ.
์ค์ํ๊ณ ์ฌ๋ฌ๊ฐ์ง๋ก ์ฐ์ผ ์ ์์ผ๋๊น ๊ฒ์ค ์ธ๊บผ๋ฉด ๊ผญ ํ๋ฒ ์ฝ์ด๋ด์ค
๊ทธ๋ฆฌ๊ณ ์ฝ์ผ๋ฉด ๋๊ธ์ข ๋ฌ์์ฃผ๋ผ... ์ฝ์๋์ง ์์ฝ์๋์ง๋ฅผ ๋ชจ๋ฅด๊ฒ์
1. Fragment ์ ฐ์ด๋๋ ๋ฌด์์ธ๊ฐ?ย
Fragment ์ ฐ์ด๋์ ๊ธฐ๋ณธ ์ฝ๋๋ ์๋์ ๊ฐ์.
//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
ย ย gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
}
๊ทธ๋ฌ๋ฉด ์ด๊ฒ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋?ย
1. ๊ทธ๋ฆผ์ ์์ ์กฐ๊ธ์ฉ ๋ฐ๊พธ๊ณ ์ถ์๋
2. ๊ทธ๋ฆผ์ ๋ชจ์์ ๋ณํ์ํค๊ณ ์ถ์ ๋
์๋ 2๋ฒ์ vertex ์ ฐ์ด๋๋ก ํ๋๊ฑด๊ฐ ์ถ์๋๋ฐ ์ ๋ฒ์ ๋งํ๋ค์ํผ surface ์จ์ํ๋๊น 2๋ฒ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์ด์ง๋๋ผ๊ณ ใ ใ
๊ทธ๋ผ 1๋ฒ๋ถํฐ ์ดํด๋ณด๋๋ก ํ์.
2. Fragment ์ ฐ์ด๋๋ฅผ ์ด์ฉํ ์์ ๋ณํ
์ฐ์ ์์์ผ ํ ๊ฒ, ๊ฒ์ค์์์๋ ๋ค๋ฅด๊ฒ Fragment ์
ฐ์ด๋๋ ์์ 0~255๊น์ง ์ฐ๋๊ฒ ์๋๊ณ 0~1๊น์ง๋ฅผ ์จ.ย
์์ ๋ฅผ ํ๋ ๋ณด์ฌ์ค๊ป,ย
//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 uv;
uniform vec2 pq;
void main()
{
ย ย gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord);
ย ย gl_FragColor -= vec4(1.0,0.0,0.0,0.0);
}
์ข. ๊ธฐ๋ณธ ๋ชจ์ย ย ย ย ย ย ย ย ย ย ย ย ย ย ์ฐ. ์ ฐ์ด๋ ์ ์ฉ ๋ชจ์ต
์ด๊ฑด ์์ r, ๊ทธ๋ฌ๋๊น ๋นจ๊ฐ ์ฑ๋ถ์ ๋ชจ๋ ๋บ ๋ชจ์ต์ด์ผ. ํฐ์์ ๋นจ๊ฐ์ด ๋น ์ก์ผ๋ g,b๊ฐ ์์ธ ์์ด๋๊ณ ๋นจ๊ฐ์ ๊ฒ์ ์ด, ๋นจ๊ฐ๊ณผ ์ด๋ก์ด ์์ฌ์๋ ๋ ธ๋์ ๊ทธ๋ฅ ์ด๋ก์์ด ๋์์ด.ย
๋ง์ฝ ์บ๋ฆญํฐ๊ฐ ๋ฐค์ด ๋์ด ์ฝ๊ฐ ํธ๋ฅด์ค๋ฆํ๊ณ ์ด๋์ด ๋ชจ์ต์ ์ฃผ๊ณ ์ถ๋ค๋ฉด ๋นจ๊ฐ์กฐ๊ธ ๋นผ๊ณ , ์ด๋ก์กฐ๊ธ ๋นผ๊ณ , ํ๋ ์กฐ๊ธ ๋นผ๋ฉด ๋๊ฒ ์ง?ย
๋ฉ์ธ์ฝ๋ ๋์งธ์ค vec4๋ฅผ 0.5,0.5,0.3,0.0์ผ๋ก ํ๋ฉด ์๋์๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์.
์ฝ๊ฐ ์ด๋์์ง๊ฑฐ ๊ฐ์ง? ๋ด๊ฐ ์๊ณ ์๋ผ ์ ํํ ์๊ฐ์ ๋ชป์ฃผ๊ฒ ๋๋ฐ ์์์ ์ ๋ง์ถฐ์ ์จ. ๋ฐ๋๋ก ์ฝ๊ฐ ๋ฐ์์ง๊ณ ๋ฐ์คํ ๋๋์ ์ฃผ๊ณ ์ถ์ผ๋ฉด ์์ ์กฐ๊ธ์ฉ ๋ํด์ฃผ๋ฉด ๋๊ฒ ์ง?
์ด๊ฑด 0.25,0.05,0.05,0.0์ผ๋ก ํ๊ฑฐ์ผ. ์ญ์ ์์์ ๋ง์๋๋๊ฑธ๋ฃจ ์จ
3. Fragment ์ ฐ์ด๋๋ฅผ ์ด์ฉํ ๋ชจ์ต์ ๋ณํ
์ด๊ฑด ์ฝ๊ฐ ์ด๋ ค์ด๋ฐ, vertex์ ฐ์ด๋๊ฐ ์๋ ๋ชจ์ต์ ๋ค๋ฅธ๊ณณ์ ์ถ๋ ฅํ๋๊ฑฐ์์์?ย
๊ทธ๋ฐ๋ฐ Fragment ์ ฐ์ด๋๋ ํ ์์น์์ ๋ค๋ฅธ ๊ฐ์ ๋ฐ์์ค๋๊ฑฐ์ผ.
์๋ณธ ์ฝ๋์ v_vTexcoord ์์์? ์ด๊ฒ ์๋ vec2(v_vTexcoord.x,v_vTexcoord.y)๋ฅผ ์ค์ธ๊ฑฐ๊ฑฐ๋ ?
์ด๊ฒ ๋์ค๋๊ฑธ ์์ผ๋ก ํํํ๋ฉด Xt = f(Xt), Yt=f(Yt)๊ฐ ๋ผ.ย
๊ฑ ์ค์ด๋ฉด ์ ๋ฃ์๋๋ก ๋์ค๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ฉด๋จ...๋๋ ๋ชจ๋ฅด๊ฒ ์ด ์ฐ๋ค๋ณด๋ ํท๊ฐ๋ฆผ.
๊ทธ๋ฐ๋ฐ ์ด๊ฑธ ๋ณํ์ํค๋ฉด? ์๋ฅผ ๋ค์ด์ Xt์ ๊ทธ๋ฆด๊ฐ์ Xt๋์ Yt๋ก ๋ฃ์ด๋ณด์.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒย ์ข์ ์ฐํ๊ฐ ๋ค์งํ๊ฑธ ์๊ฐํ๊ฒ ์ง๋งย ์ด์ํ๊ฒ ๋์!ย
์๋๊ณ ? vec2์์ ์๋ ๊ฐ์ด ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ ๋จ์ํ ์์น๊ฐ ์๋๋ผ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ด์ง. C๊ณต๋ถ์ข ํ์ผ๋ฉด ํฌ์ธํฐ์ ๋ํด ์๊ป๋ฐ, ํฌ์ธํฐ์๋ค๊ฐ ์ ์๋ฅผ ์ถ๊ฐ์ํค๋ฉด ๊ฐ์ด ์์ฒญ ์ด์ํด์ง๋ฉด์ ๊ฐ์ด ์ด์ํ๊ฒ๋์ค์์? ๊ทธ๋ฐ๊ฑฐ์ผ.ย
์ ๊ทธ๋ฆฌ๊ณ ์ค์ํ๊ฒ ์ด๊ฒ ์ฃผ์๋ฅผ ์ฐ๋ค ๋ณด๋ ๋๊ฐ์ง ๋ฌธ์ ์ ์ด ์์ด... ๋ฐ์์ ๋ค๋ฃฐ๊ฒ
์ ์ด์ ์ด๋์ด ์ฃผ์๋ฅผ ์จ์ ๊ทธ๋ฆฐ๋ค๋๊ฒ์ ์์์๊บผ์ผ. ๊ทผ๋ฐ ์ฃผ์๋ผ๋๊ฒ ๊ทธ๋ ๋ฏ 1์ฐจ์ด๋ก ๋๊ฒ ์ฐจ์ด๊ฐ ๋ง์ด ๋๋๋ผ๊ตฌ... ๊ทธ๋์ ์ฃผ์ํ ๊ฒ v_vTexcoord ๋ฅผ ๋ณํ์ํฌ๋ ๋ค์ ์ถ๊ฐ์ํค๋๊ฑด ์ ๋งํ๋ฉด 0๊ณผ 1์ฌ์ด ์ซ์๋ก ํด์ผ ํ๋๋ผ๊ณ ... ๊ทธ๋ด ๋ ์ข์๊ฒ sin, cos์ด์์? ์๋๋ฉด ํน๋ณํ ์ํ๋ ์ ๋๊ฐ ์์ผ๋ฉด ๊ทธ๋งํผ ํด๋ ๋๊ณ .
์ ๊ทธ๋ผ sin์ ์จ์ ์ด๋์ ๊ธฐ์ธ์ด์ง๊ฒ ํด๋ณด์.ย
์ฐ๋ค๊ฐ ์๊ฒ๋๊ฑด๋ฐ, ์๋์ ์ ํ์ผ๋ก ๊ธฐ์ธ์ด์ง๊ฒ ํ๋๊ฑด ํ๊ธฐ๊ฐ ์ข ํ๋ค๋๋ผ๊ตฌ... ๊ทธ๋ฅ ์ ํ์ผ๋ก ์์ง์ด๋๊ฑด vertex์ฐ๋๊ฒ ๋์๋ฏ... ์ ๋๋ก ํด์ ๋ค์ํ ๊ฒ vertex๋...
ํ ํ ... ๊ทธ๊ฑด ๊ทธ๊ฑฐ๊ณ ์จ๋ , sin์ ์ด์ฉํด์ ๋ฌผ๊ฒฐ๋ฌด๋ฌ๋ฅผ ์ค๋ณด๋๋ก ํ์
ย ย gl_FragColor = v_vColour * texture2D( gm_BaseTexture, vec2(v_vTexcoord.x +sin(10.0*v_vTexcoord.y)/10.0 ,v_vTexcoord.y));
๋น ๋ฐค. ์์ด๋ ๊ฒ ๋๋๊ณ ?ย
์ด๊ฒ ๋ฐ๋ก ์ฒซ๋ฒ์งธ ๋ฌธ์ ์ผ... ๊ทธ๋ฆด๋ ค๊ณ ํ๋ ๊ณต๊ฐ์ ๋ฐ๋๋๋ฐย ๊ทธ๋ฆด ๊ณต๊ฐ์ ๋๊ฐ์์, ๋ฐ์ผ๋ก ์์ ธ๋์จ๊ฑด ์๊ทธ๋ ค์ง๋ค๋๊ฑฐ์ง
๊ทธ๋ผ ์ด๊ฑธ ์ด๋ป๊ฒ ํด๊ฒฐํ๋๋? ์ ๋ฒ์ ๋งํด์คฌ๋ค์ํผ surface๊ธฐ๋ฅ์ ์ฐ๋ฉด ์ฌ์. ๊ทธ๋ฌ๋๊น, ์ ๋ชจ์ต์ ๋ฐ๋ก ์ ฐ์ด๋์ ๋ฃ๋๊ฒ ์๋๊ณ , surface๋ฅผ ํ๋ ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ์๋ค๊ฐ ์คํ๋ผ์ดํธ๋ฅผ ๊ทธ๋ฆฌ๊ณ ๊ทธ surface ์๋ค๊ฐ ์ ฐ์ด๋๋ฅผ ์ ์ฉ์ํค๋๊ฑฐ์ง!
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ๋์! ์ ์ฉ์ํจ ์ฝ๋๋ ์๋์ ๊ฐ์.
//Creation
surf=surface_create(200,200);
//Draw
surface_set_target(surf);
draw_sprite_ext(sprite_index,image_index,30,30,image_xscale,image_yscale,image_angle,c_white,1);
surface_reset_target();
shader_set(shader0);
draw_surface(surf,x-30,y-30);
shader_reset();
draw_sprite_ext์์ 30ํ๊ณ draw_surface์์ 30์ ๊ฐ์ ์ซ์์ผ๋๊ณ , surface_create ์์ 200์ ์ ๋นํ ํฐ ์ซ์์ด๋ฉด ๋ผ.
์ค๋์ ์ฌ๊ธฐ๊น์งํ ๊ฒ. ์ด์ ๋ ์์์ผ๋ฉด ์ ฐ์ด๋๊ฐ ์ด๋ป๊ฒ ์์ฉ๋๋์ง ๊ฐ ์ก์์ ์์๊บผ์ผ.
์ค ์ ๊ธฐ