ã°ã©ãã£ãã¯ã·ã§ãŒããŒã®äœæããã¹ã¿ãŒãããšããããšã¯ãæ°åã®äžŠåã³ã¢ãåãããããªããã»ããµã®ãã¹ãŠã®ãã¯ãŒãå¶åŸ¡ããããšãæå³ããŸãã ãã®ããã°ã©ãã³ã°æ¹æ³ã§ã¯ãç°ãªãèãæ¹ãå¿
èŠã§ããããã®å¯èœæ§ã解ãæŸã€ããšã¯åªåãã䟡å€ããããŸãã
ææ°ã®ã°ã©ãã£ãã¯ã·ãã¥ã¬ãŒã·ã§ã³ã®ã»ãšãã©ã¯ããããªããã»ããµçšã«èšè¿°ãããã³ãŒãã䜿çšããŠããŸãããã€ãã¯AAAã²ãŒã ã®ãªã¢ã«ãªç
§æå¹æãããåŸåŠçãšæµäœã·ãã¥ã¬ãŒã·ã§ã³ã®2次å
å¹æãŸã§ã
è€æ°ã®ã·ã§ãŒããŒãè¿œå ããååŸã®Minecraftã®ã·ãŒã³ããã®ãã¥ãŒããªã¢ã«ã®ç®ç
ã·ã§ãŒããŒããã°ã©ãã³ã°ã¯ãç¥ç§çãªãã©ãã¯ããžãã¯ã®ããã«æããããã°ãã°èª€è§£ãããŸãã ä¿¡ããããªãã»ã©ã®å¹æã®äœæã瀺ãå€ãã®ã³ãŒãäŸããããŸããã説æã¯ã»ãšãã©ãããŸããã ç§ã®ã¬ã€ãã§ã¯ããã®ã®ã£ãããåããããšæã£ãŠããŸãã ã·ã§ãŒããŒã³ãŒãã®äœæãšç解ã®åºæ¬ååã«äž»ã«çŠç¹ãåœãŠãç¬èªã®ã·ã§ãŒããŒããŒãããç°¡åã«ã«ã¹ã¿ãã€ãºãçµã¿åããããŸãã¯äœæã§ããããã«ããŸãïŒ
ããã¯äžè¬çãªã¬ã€ãã§ãããããããã§åŠç¿ãããã¹ãŠã®ãã®ã¯ãã·ã§ãŒããŒã䜿çšãããããããã¯ãããžãŒã§äœ¿çšã§ããŸãã
ã·ã§ãŒããŒãšã¯äœã§ããïŒ
ã·ã§ãŒããŒã¯ãã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã§å®è¡ãããåãªãããã°ã©ã ã§ãã åãã¯ã»ã«ã®ã¬ã³ããªã³ã°æ¹æ³ãã³ã³ãã¥ãŒã¿ãŒã«äŒããŸãã ãããã®ããã°ã©ã ã¯ã
ç
§æã
ã·ã§ãŒãã£ã³ã°ã®å¹æãå¶åŸ¡ããããã«ãã䜿çšããããããã·ã§ãŒããŒïŒãã·ã§ãŒããŒãïŒãšåŒã°ããŸãããä»ã®ç¹æ®å¹æã«äœ¿çšãããããšã劚ãããã®ã¯ãããŸããã
ã·ã§ãŒããŒã¯ç¹å¥ãªã·ã§ãŒããŒèšèªã§èšè¿°ããŸãã ãŸã£ããæ°ããèšèªãåŠã¶å¿
èŠã¯ãããŸãããCã«äŒŒãGLSLïŒOpenGLã·ã§ãŒãã£ã³ã°èšèªïŒã䜿çšããŸãïŒç°ãªããã©ãããã©ãŒã çšã®
ã·ã§ãŒããŒã
èšè¿°ããããã®
èšèªã¯ããã€ããããŸããããããã¯ãã¹ãŠãããªããã»ããµã§ã®å®è¡ã«é©åããŠãããããäºãã«é¡äŒŒããŠããŸãå人ãïŒ
泚ïŒãã®èšäºã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒå°çšã§ãã ä»ã®çš®é¡ã®ã·ã§ãŒããŒããããã©ããã«èå³ãããå Žåã¯ãOpenGL Wikiã§ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã®ããŸããŸãªæ®µéã«ã€ããŠèªãããšãã§ããŸããããå§ããŸãããïŒ
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã
ShaderToyã䜿çšã
ãŸã ã ããã«ãããã€ã³ã¹ããŒã«ãšæ§æã«ç
©ããããããšãªãããã©ãŠã¶ãŒã§çŽæ¥ã·ã§ãŒããŒã®ããã°ã©ãã³ã°ãéå§ã§ããŸãïŒ ïŒã¬ã³ããªã³ã°ã«ã¯WebGLã䜿çšããããããã®ãã¯ãããžãŒããµããŒããããã©ãŠã¶ãŒãå¿
èŠã§ããïŒ
ã¢ã«ãŠã³ããäœæããå¿
èŠã¯ãããŸããããã³ãŒããä¿åããã«ã¯äŸ¿å©ã§ãã
泚ïŒå·çæç¹ã§ã¯ãShaderToyã¯ããŒã¿çã§ãã
[ãããã
ã trans .: 2015幎ã®èšäº] ã äžéšã®ã€ã³ã¿ãŒãã§ã€ã¹/æ§æã®è©³çŽ°ã¯è¥å¹²ç°ãªãå ŽåããããŸãã
New Shaderãã¯ãªãã¯ãããšã次ã®ãããªãã®ã衚瀺ãããŸãã

ç»é²ããŠããªãå Žåãã€ã³ã¿ãŒãã§ãŒã¹ã¯è¥å¹²ç°ãªãå ŽåããããŸãã
以äžã®å°ããªé»ãç¢å°ã¯ãã³ãŒããã³ã³ãã€ã«ããã®ã«åœ¹ç«ã¡ãŸãã
äœãèµ·ãã£ãŠããã®ïŒ
ã·ã§ãŒããŒãã©ã®ããã«æ©èœãããã1ã€ã®æã§èª¬æããŸãã æºåã¯ããïŒ ããã«ããïŒ
ã·ã§ãŒããŒã®å¯äžã®ç®çã¯ã r
ã g
ã b
4ã€ã®æ°å€ãè¿ãããšã§ã ãããã¯ãŸãã«ã·ã§ãŒããŒãã§ããããšã§ãããããã ãã§ãã ãã®é¢æ°ã¯ãç»é¢äžã®åãã¯ã»ã«ã«å¯ŸããŠå®è¡ãããŸãã ãããã®4ã€ã®è²ã®å€ãè¿ããããã¯ã»ã«ã®è²ã«ãªããŸãã ããã¯ã
ãã¯ã»ã«ã·ã§ãŒã㌠ïŒ
ãã©ã°ã¡ã³ãã·ã§ãŒããŒãšãåŒã°ããŸãïŒãšåŒã°ãããã®ã§ãã
ããã念é ã«çœ®ããŠãç»é¢ãèµ€äžè²ã§å¡ããŸãããã RGBAå€ïŒéæ床ã決å®ããèµ€ãç·ãéãã¢ã«ãã¡ïŒã¯
0
ãã
1
ãŸã§å€åãããããè¡ãå¿
èŠãããã®ã¯
r,g,b,a = 1,0,0,1
è¿ãããšã ãã§ãã ShaderToyã¯ããã¯ã»ã«ã®æçµè²ã
fragColor
ã«æ ŒçŽãããããšã
fragColor
ãŸãã
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { fragColor = vec4(1.0,0.0,0.0,1.0); }
ããã§ãšãããããŸãïŒ ãããæåã®å®æããã·ã§ãŒããŒã§ãïŒ
ã¿ã¹ã¯ïŒè²ãçŽç°è²ã«å€æŽããŠã¿ãŠãã ããã
vec4
ã¯åãªãããŒã¿åãªã®ã§ã次ã®ããã«è²ãå€æ°ãšããŠå®£èšã§ããŸãã
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec4 solidRed = vec4(1.0,0.0,0.0,1.0); fragColor = solidRed; }
ããã¯ããŸãåºæ¿çã§ã¯ãããŸããã
æ°åäžãã¯ã»ã«ã®ã³ãŒããåæã«å®è¡ããèœåãããã1ã€ã®è²ã§ãã€ã³ãããŸãã
ç»é¢ã«ã°ã©ããŒã·ã§ã³ãã¬ã³ããªã³ã°ããŠã¿ãŸãããã ç»é¢äžã®äœçœ®ãªã©ã圱é¿ãäžãããã¯ã»ã«ã«ã€ããŠããã€ãã®ããšãç¥ããªããã°ãå€ããéæããããšã¯ã§ããŸãã...
ã·ã§ãŒããŒå
¥å
ãã¯ã»ã«ã·ã§ãŒããŒã¯ã䜿çšã§ããããã€ãã®
å€æ°ãæž¡ããŸãã æãæçšãªãã®ã¯
fragCoord
ãããã«ã¯ããã¯ã»ã«ïŒããã³3Dã§äœæ¥ããŠããå Žåã¯ZïŒã®Xããã³Y座æšãå«ãŸããŸãã ç»é¢ã®å·ŠåŽã®ãã¹ãŠã®ãã¯ã»ã«ãé»ã«ãå³åŽã®ãã¹ãŠã®ãã¯ã»ã«ãèµ€ã«å€ããŠã¿ãŸãããã
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 xy = fragCoord.xy; // vec4 solidRed = vec4(0,0.0,0.0,1.0);// if(xy.x > 300.0){// , ! solidRed.r = 1.0;// 1.0 } fragColor = solidRed; }
æ³šïŒ obj.x
ã
obj.y
ã
obj.z
ããã³
obj.w
ã䜿çšããŠã
ãŸã㯠obj.r
ã
obj.g
ã
obj.b
ã
obj.a
ã䜿çšããŠã
obj.z
ã®ã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ã§ããŸãã ãããã¯åçã§ãããã³ãŒãã®èªã¿åããåçŽåãã䟿å©ãªåœåæ¹æ³ã§ãããªããªãã人ã
ã¯
obj.r
èŠããšã
obj
ãè²ã§ããããšãç解ããããã§ãã
äžèšã®ã³ãŒãã«åé¡ããããŸãããïŒ ãã¬ãã¥ãŒãŠã£ã³ããŠã®å³äžé
ã«ãã[
å
šç»é¢è¡šç€º]ãã¿ã³ãã¯ãªãã¯ããŠã¿ãŠãã ããã
ç»é¢ã®èµ€ãéšåã®ãµã€ãºã¯ç°ãªããç»é¢ã®ãµã€ãºã«ãã£ãŠç°ãªããŸãã ç»é¢ã®ã¡ããã©ååãèµ€ããã€ã³ãããã«ã¯ããã®ãµã€ãºãç¥ãå¿
èŠããããŸãã éåžžãç»é¢ãµã€ãºã¯ã¢ããªã±ãŒã·ã§ã³ãäœæããããã°ã©ããŒã«ãã£ãŠéžæãããããããã¯ã»ã«ã®äœçœ®ã®ãããªã€ã³ã©ã€ã³å€æ°ã§ã¯ãã
ãŸãã ã ãã®å Žåãç»é¢ãµã€ãºã¯ShaderToyéçºè
ã«ãã£ãŠèšå®ãããŸãã
äœããçµã¿èŸŒã¿å€æ°ã§ãªãå Žåããã®æ
å ±ãäžå€®åŠçè£
眮ïŒã¡ã€ã³ããã°ã©ã ããïŒãããããªããã»ããµïŒã·ã§ãŒããŒïŒã«éä¿¡ã§ããŸãã ShaderToyã¯ãã®ã¿ã¹ã¯ãåŒãåããŸãã ã·ã§ãŒããŒã«æž¡ããããã¹ãŠã®å€æ°ã¯ãã
ã·ã§ãŒããŒå
¥åãã¿ãã§æå®ãããŸãã ãã®ããã«ããŠCPUãããããªããã»ããµã«è»¢éãããå€æ°ã¯ãGLSL
ãŠããã©ãŒã ïŒã°ããŒãã«ïŒãšåŒã°ããŸãã

ç»é¢ã®äžå¿ãæ£ãã決å®ããããã«ã³ãŒããå€æŽããŸãããã
iResolution
ã·ã§ãŒããŒ
iResolution
ã䜿çšããå¿
èŠããã
iResolution
ã
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 xy = fragCoord.xy; // xy.x = xy.x / iResolution.x; // xy.y = xy.y / iResolution.y; // x 0, 1 vec4 solidRed = vec4(0,0.0,0.0,1.0); // if(xy.x > 0.5){ solidRed.r = 1.0; // 1.0 } fragColor = solidRed; }
ãã¬ãã¥ãŒãŠã£ã³ããŠã®ãµã€ãºãå€æŽããããšãããšãè²ã«ãã£ãŠç»é¢ãæ£ç¢ºã«ååã«åå²ãããŸãã
ã¹ããªããããã°ã©ããŒã·ã§ã³ãž
ãããã°ã©ããŒã·ã§ã³ã«å€ããã®ã¯éåžžã«ç°¡åã§ãã è²ã®å€ã¯
0
ãã
1
ãŸã§å€åãã座æšã
0
ãã
1
ãŸã§å€åã
0
ã
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 xy = fragCoord.xy; // xy.x = xy.x / iResolution.x; // xy.y = xy.y / iResolution.y; // x 0, 1 vec4 solidRed = vec4(0,0.0,0.0,1.0); // solidRed.r = xy.x; // x fragColor = solidRed; }
åºæ¥äžããïŒ
ã¿ã¹ã¯ïŒãã®åçãåçŽæ¹åã®ã°ã©ããŒã·ã§ã³ã«å€ããããšãã§ããŸããïŒ å¯Ÿè§ç·ã¯ã©ãã§ããïŒ ããã€ãã®è²ã®ã°ã©ããŒã·ã§ã³ã¯ã©ãã§ããïŒ
ã³ãŒããè©ŠããŠã¿ããšãå·Šäžé
ã®åº§æšã
(0,0)
ã§ã¯
ãªã (0,0)
(0,1)
ã§ããããšã«æ°ä»ãã§ãããã ããã¯èŠããŠããããšãéèŠã§ãã
ç»åã¬ã³ããªã³ã°
è²ãè©ŠããŠã¿ãã®ã¯é¢çœãã§ãããå°è±¡çãªããšããããå Žåãã·ã§ãŒããŒã¯ç»åãåãåããå
¥åãšããŠå€æŽããæ¹æ³ãåŠã¶å¿
èŠããããŸãã ãããã£ãŠãã²ãŒã ç»é¢å
šäœã«åœ±é¿ããã·ã§ãŒããŒïŒãæ°Žäžããšãã§ã¯ããè²è£æ£ãªã©ïŒãååŸããããç¹å®ã®ãªããžã§ã¯ãã«å¯ŸããŠã®ã¿å¿
èŠãªæ¹æ³ã§åäœãããããããšãã§ããŸãïŒäŸãã°ãçŸå®çãªç
§æã·ã¹ãã ãäœæããããïŒã
éåžžã®ãã©ãããã©ãŒã ã§ããã°ã©ãã³ã°ããå Žåãç»é¢è§£å床ãéä¿¡ããã®ãšåãããã«ãç»åããã»ããµïŒãŸãã¯ãã¯ã¹ãã£ïŒã
åäžãšããŠãããªããã»ããµã«è»¢éããå¿
èŠããããŸãã ShaderToyããããåŠçããŠãããŸãã ç»é¢ã®äžéšã«4ã€ã®å
¥åãã£ãã«ããããŸãã
4ã€ã®å
¥åãã£ã³ãã«ShaderToyiChannel0ãã¯ãªãã¯ããŠããã¯ã¹ãã£ïŒç»åïŒãéžæããŸãã
ãã®çµæãã·ã§ãŒããŒã«æž¡ãããã€ã¡ãŒãžããããŸãã ãã ãã1ã€ã®åé¡ããããŸã
DrawImage()
é¢æ°ã®æ¬ åŠã§ãã ãã¯ã»ã«ã·ã§ãŒããŒã§ã§ããããšã¯
ãåãã¯ã»ã«ã®è²ãå€æŽããããšã ãã§ãã
è²ã®ã¿ãè¿ãããšãã§ããå Žåãã©ã®ããã«ããŠç»é¢ã«ãã¯ã¹ãã£ãæç»ã§ããŸããïŒ ã·ã§ãŒããŒã®çŸåšã®ãã¯ã»ã«ããã¯ã¹ãã£ã®å¯Ÿå¿ãããã¯ã»ã«ã«äœããã®æ¹æ³ã§ãã€ã³ãããå¿
èŠããããŸãã
ç»é¢äžã®äœçœ®ïŒ0,0ïŒã«ãã£ãŠã¯ããã¯ã¹ãã£ãé©åã«ã¹ãããããããã«Y軞ãå転ããå¿
èŠãããå ŽåããããŸãã å·çæç¹ã§ã¯ãShaderToyã¯æŽæ°ãããŠãããéå§ç¹ã¯å·Šäžé
ã«ãããããäœãåæ ããå¿
èŠã¯ãããŸãããtexture(textureData,coordinates)
é¢æ°ã䜿çšããŠãã€ã³ãã§ããŸãããã®é¢æ°ã¯å
¥åã§ãã¯ã¹ãã£ããŒã¿ãšåº§æšã®ãã¢
(x, y)
ãåãåãããããã®åº§æšã®ãã¯ã¹ãã£ã«ã©ãŒã
vec4
ãšããŠ
vec4
ãŸãã
座æšã奜ããªããã«ç»é¢ã«ã¹ãããã§ããŸãã ç»é¢å
šäœã®4åã®1ã«ãã¯ã¹ãã£å
šäœãæç»ããïŒãã¯ã»ã«ãã¹ããããããã€ãŸã瞮尺ãå°ããããïŒãããã¯ã¹ãã£ã®äžéšã®ã¿ãæç»ããããšãã§ããŸãã
ç»åãèŠããã ããªã®ã§ããã¯ã»ã«ã¯1ïŒ1ã¹ã±ãŒã«ã§äžèŽããŸãïŒ
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 xy = fragCoord.xy / iResolution.xy;
æåã®ç»åãã§ããŸããïŒ

ããã§ããã¯ã¹ãã£ããããŒã¿ãæ£ããåãåãæ¹æ³ãåŠç¿ããã®ã§ããããã䜿ã£ãŠäœã§ãã§ããŸãïŒ ããããåŒã䌞ã°ããããæ¡å€§çž®å°ããããè²ãå®éšãããã§ããŸãã
åã«ãã£ãããã«ãç»åã«ã°ã©ããŒã·ã§ã³ãé©çšããŠã¿ãŸãããïŒ
texColor.b = xy.x;

ããã§ãšãããããŸããããªãã¯ããªãã®æåã®åŸåŠçå¹æãæžããã°ããã§ãïŒ
ã¿ã¹ã¯ïŒã€ã¡ãŒãžãçœé»ã«ããã·ã§ãŒããŒãäœæã§ããŸããïŒ
éæ¢ç»åãéžæããŸãããã衚瀺ããããã®ã¯ãã¹ãŠãªã¢ã«ã¿ã€ã ã§å®è¡ãããããšã«æ³šæããŠãã ããã ããã確èªããã«ã¯ãéæ¢ç»åããããªã«çœ®ãæããŸã
ãiChannel0ãã¯ãªãã¯ããŠãä»»æã®ãããªãéžæããŸãã
ã¢ãŒã·ã§ã³ãè¿œå
ãããŸã§ã®ãšããããšãã§ã¯ãã¯ãã¹ãŠéçã§ãã ShaderToyãæäŸããå
¥åã䜿çšããŠãããã«èå³æ·±ãããšãã§ããŸãã
iGlobalTime
ã¯å¢ãç¶ããå€æ°ã§ãã ãããã·ãŒããšããŠäœ¿çšããŠãåšæçãªå¹æãäœæã§ããŸãã è²ãå°ãè©ŠããŠã¿ãŸãããã
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 xy = fragCoord.xy / iResolution.xy; // vec4 texColor = texture(iChannel0,xy); // iChannel0 xy texColor.r *= abs(sin(iGlobalTime)); texColor.g *= abs(cos(iGlobalTime)); texColor.b *= abs(sin(iGlobalTime) * cos(iGlobalTime)); fragColor = texColor; // }
GLSLã«ã¯ãµã€ã³é¢æ°ãšã³ãµã€ã³é¢æ°ãçµã¿èŸŒãŸããŠããã»ããä»ã®å€ãã®äŸ¿å©ãªé¢æ°ïŒãã¯ãã«ã®é·ãã2ã€ã®ãã¯ãã«éã®è·é¢ã®ååŸãªã©ïŒããããŸãã è²ã®å€ãè² ã«ããããšã¯ã§ããªãããã
abs
é¢æ°ã䜿çšããŠçµ¶å¯Ÿå€ãååŸããå¿
èŠããããŸãã
ã¿ã¹ã¯ïŒã€ã¡ãŒãžãçœé»ããã«ã©ãŒããŸãã¯ãã®éã«å€æŽããã·ã§ãŒããŒãäœæã§ããŸããïŒ
ã·ã§ãŒããŒã®ãããã°ã«é¢ãã泚æ
ã³ãŒãããããã°ããå Žåãã¹ãããããšã«ã³ãŒããå®è¡ããããå€ãå°å·ãããã§ããŸãããã·ã§ãŒããŒãäœæããå Žåã¯äžå¯èœã§ãã ãã©ãããã©ãŒã ã®ãããã°ããŒã«ãæ€çŽ¢ã§ããŸãããäžè¬çãªã±ãŒã¹ã§ã¯ããã§ãã¯ãããå€ã衚瀺å¯èœãªäœããã®ã°ã©ãã£ãã¯æ
å ±ã«ãã€ã³ãããã®ãæåã§ãã
ãŸãšãããš
ãããã¯ã·ã§ãŒããŒãæäœããããã®éåžžã«åºæ¬çãªãã®ã§ããããããããã¹ã¿ãŒããã°ãããã«å€ããéæã§ããŸãã
ShaderToyãšãã§ã¯ãã
ãã§ãã¯ããŠãç解ãŸãã¯åçŸã§ãããã©ããã
確èªããŠãã ãã ïŒ
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã
é ç¹ã·ã§ãŒããŒã«ã€ããŠã¯èšåããŸããã§ããã ãããã¯åãèšèªã§æžãããŠããŸããããã¯ã»ã«ã§ã¯ãªãåé ç¹ã«å¯ŸããŠå®è¡ãããè²ãšãšãã«äœçœ®ãè¿ããŸãã éåžžãé ç¹ã·ã§ãŒããŒã¯3Dã·ãŒã³ãç»é¢ã«æ圱ããŸãïŒãã®æ©èœã¯ã»ãšãã©ã®ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã«çµã¿èŸŒãŸããŠããŸãïŒã ãã¯ã»ã«ã·ã§ãŒããŒã¯ãç»é¢ã«è¡šç€ºãããã»ãšãã©ã®è€éãªå¹æãæäŸããã®ã§ããããã確èªããŸãã
å¥ã®ã¿ã¹ã¯ïŒ ShaderToyã䜿çšããŠãããªããç·ãåé€ããæåã®ãããªã®èæ¯ãšããŠå¥ã®ãããªãè¿œå ããã·ã§ãŒããŒãäœæã§ããŸããïŒ
以åã«
䜿çšããShaderToyã¯ãè¿
éãªãã¹ããšå®éšã«æé©ã§ããããã®æ©èœã¯ããªãå¶éãããŠããŸãã ããšãã°ãã·ã§ãŒããŒã«æž¡ãããããŒã¿ãå¶åŸ¡ããããšã¯ã§ããŸããã ã·ã§ãŒããŒãèµ·åããããã®ç¬èªã®ç°å¢ãããã°ãããããçš®é¡ã®èå³æ·±ããšãã§ã¯ããäœæããç¬èªã®ãããžã§ã¯ãã§äœ¿çšã§ããŸãïŒ ãã©ãŠã¶ãŒã§ã·ã§ãŒããŒãå®è¡ããã«ã¯ããã¬ãŒã ã¯ãŒã¯ãšããŠThree.jsã䜿çšããŸãã WebGLã¯ã·ã§ãŒããŒãã¬ã³ããªã³ã°ã§ããJavascript APIã§ããThree.jsã¯äœæ¥ãç°¡çŽ åããããã«ã®ã¿å¿
èŠã§ãã
JavaScriptãŸãã¯Webãã©ãããã©ãŒã ã«èå³ããªãå Žåã¯ãå¿é
ããªãã§ãã ãããWebã¬ã³ããªã³ã°ã®æ©èœã«ã€ããŠã¯èª¬æããŸããïŒãã ãããã¬ãŒã ã¯ãŒã¯ã«ã€ããŠè©³ããç¥ãããå Žåã¯ã
ãã®ãã¥ãŒããªã¢ã«ãåç
§ã
ãŠãã ãã ïŒã ãã©ãŠã¶ãŒã§ã·ã§ãŒããŒãã»ããã¢ããããã®ãæéã®æ¹æ³ã§ããããã®ããã»ã¹ããã¹ã¿ãŒããã°ãã©ã®ãã©ãããã©ãŒã ã§ãã·ã§ãŒããŒãç°¡åã«æ§æããŠäœ¿çšã§ããŸãã
ã«ã¹ã¿ãã€ãº
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã·ã§ãŒããŒã®ããŒã«ã«æ§æã«ã€ããŠæ€èšããŸãã
ãã®ãã«ãã€ã³CodePenãŠã£ãžã§ããã®ãããã§ãäœããããŠã³ããŒãããããšãªããç§ã®åŸã«ç¹°ãè¿ãããšãã§ã
ãŸã ïŒ
ãã©ãŒã¯ãäœæãã CodePenã§
ãããžã§ã¯ããç·šéã§ã
ãŸã ã
ããã«ã¡ã¯Three.jsïŒ
Three.jsã¯ãã·ã§ãŒããŒã®ã¬ã³ããªã³ã°ã«å¿
èŠãªWebGLã®ãã€ã©ãŒãã¬ãŒãã³ãŒãã®å€§éšåãåŒãç¶ãJavaScriptãã¬ãŒã ã¯ãŒã¯ã§ãã æãç°¡åãªéå§æ¹æ³ã¯
ãCDNã«æçš¿ãããŠãã
ããŒãžã§ã³ã䜿çšããããšã§ãã
HTMLãã¡ã€ã«ãããŠã³ããŒãã§ã
ãŸã ãããã¯ãåçŽãªThreejsã·ãŒã³ã§ãã
ãã¡ã€ã«ããã£ã¹ã¯ã«ä¿åãããã©ãŠã¶ã§éããŸãã é»ãç»é¢ã衚瀺ãããã¯ãã§ãã ãŸã ããŸãé¢çœããªãã®ã§ããã¹ãŠãæ©èœããããšã確èªããããã ãã«ãã¥ãŒããè¿œå ããŠã¿ãŸãããã
ãã¥ãŒããäœæããã«ã¯ããžãªã¡ããªãšãããªã¢ã«ã決å®ãããããã·ãŒã³ã«è¿œå ããå¿
èŠããããŸãã 次ã®ã³ãŒãã¹ããããã[
Add your code here
ãã£ãŒã«ãã«
Add your code here
ã
var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00} );
ã·ã§ãŒããŒã«ãã£ãšèå³ãããã®ã§ããã¥ãŒãã詳现ã«æ€èšããŸããã ãããããã¹ãŠãæ£ããè¡ããããšãç»é¢ã®äžå€®ã«ç·è²ã®ç«æ¹äœã衚瀺ãããŸãã

ããã«ããéã«ãã¹ãã³ãããŠã¿ãŸãããã
render
é¢æ°ã¯ãã¬ãŒã ããšã«å®è¡ãããŸãã
cube.rotation.x
ïŒãŸãã¯
.y
ãŸãã¯
.z
ïŒãä»ããŠãã¥ãŒãã®å転ã«ã¢ã¯ã»ã¹ã§ããŸãã å€ãå¢ãããŠãã¬ã³ããªã³ã°é¢æ°ã次ã®ããã«ãªãããã«ããŠãã ããã
function render() { cube.rotation.y += 0.02; requestAnimationFrame( render ); renderer.render( scene, camera ); }
課é¡ïŒãã¥ãŒããå¥ã®è»žã§å転ã§ããŸããïŒ åæã«2ã€ã®è»è»žã¯ã©ãã§ããïŒ
ããã§æºåãæŽããŸãããã·ã§ãŒããŒãè¿œå ããŸãããïŒ
ã·ã§ãŒããŒãè¿œå ãã
ãã®æ®µéã§ãã·ã§ãŒããŒãå®è£
ããããã»ã¹ã«ã€ããŠèãå§ããããšãã§ããŸãã ã»ãšãã©ã®å Žåããã©ãããã©ãŒã ã«é¢ä¿ãªãåããããªç¶æ³ã«ãªããŸãããã¹ãŠãæ§æããããªããžã§ã¯ããç»é¢ã«æç»ãããŸãããããªããã»ããµã«ã¢ã¯ã»ã¹ããã«ã¯ã©ãããã°ããã§ããããã
ã¹ããã1ïŒGLSLã³ãŒããããŠã³ããŒããã
JavaScriptã䜿çšããŠã·ãŒã³ãäœæããŸãã ä»ã®ç¶æ³ã§ã¯ãC ++ãLuaããŸãã¯ãã®ä»ã®èšèªã䜿çšã§ããŸãã ããã«é¢ä¿ãªããã·ã§ãŒããŒã¯ç¹å¥ãª
ã·ã§ãŒããŒèšèªã§èšè¿°ãã
ãŸã ã OpenGLã·ã§ãŒããŒèšèªã¯
GLSL ïŒOpen
GL S had
L anguageïŒãšåŒã°ããŸãã OpenGLããŒã¹ã®WebGLã䜿çšããŠãããããGLSLã§èšè¿°ããŸãã
GLSLã³ãŒãã¯ã©ãã§ã©ã®ããã«æžãããŠããŸããïŒ åºæ¬ã«ãŒã«ïŒGLSLã³ãŒãã¯
ãšããŠããŒããã
ã ãã®åŸããããªããã»ããµã§è§£æãšå®è¡ã®ããã«è»¢éã§ããŸãã
JavaScriptã§ã¯ã次ã®ããã«å€æ°å
ã«ã³ãŒããæž¡ãã ãã§ãããå®è¡ã§ããŸãã
var shaderCode = " ;"
ããã¯æ©èœããŸãããJavaScriptã§è€æ°è¡ã®æååãäœæããç°¡åãªæ¹æ³ã¯ãªããããããã¯ããŸã䟿å©ã§ã¯ãããŸããã ã»ãšãã©ã®ããã°ã©ããŒã¯ãããã¹ããã¡ã€ã«ã«ã·ã§ãŒããŒã³ãŒããèšè¿°ããæ¡åŒµå
.glsl
ãŸãã¯
.frag
ïŒ
fragment shaderã®ç¥ïŒãä»ããŠããããã¡ã€ã«ãããŠã³ããŒãããã ãã§ãã
å¯èœã§ããããã®ãã¥ãŒããªã¢ã«ã§ã¯ãã·ã§ãŒããŒã³ãŒããæ°ãã
<script>
å
ã«èšè¿°ããããããJavaScriptã«ããŒãããŠããã¹ãŠã®ã³ãŒãã1ã€ã®ãã¡ã€ã«ã«åãŸãããã«ããŸãã
次ã®ãããªHTMLã§æ°ãã
<script>
ãäœæããŸãã
<script id="fragShader" type="shader-code">; </script>
åŸã§ã¢ã¯ã»ã¹ã§ãã
fragShader
ã圌ã«fragShader IDãå²ãåœãŠãŸãã
shader-code
ã¿ã€ãã¯ãå®éã«ã¯ååšããªããæ¶ç©ºã®ã¿ã€ãã®ã¹ã¯ãªããã§ãã ïŒä»ã®ååãéžæã§ããŸãïŒã ããã¯ãã³ãŒããå®è¡ããããHTMLã§è¡šç€ºãããªãããã«ããããã§ãã
次ã«ãçœãè¿ãéåžžã«ã·ã³ãã«ãªã·ã§ãŒããŒãæ¿å
¥ããŸãããã
<script id="fragShader" type="shader-code"> void main() { gl_FragColor = vec4(1.0,1.0,1.0,1.0); } </script>
ïŒãã®å Žåã®
vec4
ã³ã³ããŒãã³ãã¯ããã¥ãŒããªã¢ã«ã®åé ã§èª¬æããããã«ãRGBAå€ã«å¯Ÿå¿ããŠããŸããïŒ
次ã«ããã®ã³ãŒããããŠã³ããŒãããå¿
èŠããããŸãã ããããHTMLèŠçŽ ãèŠã€ããŠå
éšããã¹ããåãåãåçŽãªJavaScriptæååã«ããŸãã
var shaderCode = document.getElementById("fragShader").innerHTML;
ãã¥ãŒãã³ãŒãã®äžã«ããå¿
èŠããããŸãã
å¿ããªãã§ãã ããïŒæååãšããŠããŒããããã³ãŒãã®ã¿ãæå¹ãªGLSLã³ãŒããšããŠè§£æãããŸãïŒã€ãŸãã
void main() {...}
ãæ®ãã¯åãªããã€ã©ãŒãã¬ãŒãHTMLã§ããïŒ
ãã©ãŒã¯ãäœæãã CodePenã§
ãããžã§ã¯ããç·šéã§ã
ãŸã ã
ã¹ããã2ïŒã·ã§ãŒããŒãé©çšãã
ã·ã§ãŒããŒã®äœ¿çšæ¹æ³ã¯ç°ãªãå ŽåããããŸãã䜿çšãããã©ãããã©ãŒã ãšãããªããã»ããµãšã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠç°ãªããŸãã ããã«åé¡ã¯ãããŸãããç°¡åãªæ€çŽ¢ã§
ããªããžã§ã¯ããäœæããThree.jsã䜿çšããŠã·ã§ãŒããŒãé©çšããæ¹æ³ãèŠã€ããããšãã§ããŸã ã
ç¹å¥ãªãããªã¢ã«ãäœæããã·ã§ãŒããŒã³ãŒãã«æž¡ãå¿
èŠããããŸãã ã·ã§ãŒããŒãªããžã§ã¯ããšããŠããã¬ãŒã³ãäœæããŸãïŒãã ãããã¥ãŒãã䜿çšã§ããŸãïŒã å¿
èŠãªããšã¯æ¬¡ã®ãšããã§ãã
ãã®æç¹ã§ãçœãç»é¢ã衚瀺ãããã¯ãã§ãã
ãã©ãŒã¯ãäœæãã CodePenã§
ãããžã§ã¯ããç·šéã§ã
ãŸã ã
ã·ã§ãŒããŒã³ãŒãã®è²ãä»ã®è²ã«çœ®ãæããŠããŒãžãæŽæ°ãããšãæ°ããè²ã衚瀺ãããŸãã
ç®çïŒç»é¢ã®äžéšãèµ€ãããäžæ¹ãéã«ã§ããŸããïŒ ïŒããŸããããªãå Žåã¯ã次ã®ã¹ãããã§ãã³ãã瀺ããŸãïŒïŒ
ã¹ããã3ïŒããŒã¿è»¢é
ãã®æç¹ã§ãæ¢ã«ã·ã§ãŒããŒã§äœã§ã
ã§ããŸãããäœ
ãã§ããã
ã¯ãŸã ããããŸããã ãã¯ã»ã«
gl_FragCoord
äœçœ®ã決å®ããçµã¿èŸŒã¿æ©èœã®ã¿ããããèŠããŠããå Žåããã®äœçœ®ã¯æ£èŠåãããŸãã å°ãªããšããç»é¢ã®ãµã€ãºãç¥ãå¿
èŠããããŸãã
ããŒã¿ãã·ã§ãŒããŒã«è»¢éããã«ã¯ã
ãŠããã©ãŒã å€æ°ãšåŒã°ãããã®ãéä¿¡ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã
uniforms
ãªããžã§ã¯ããäœæããããã«å€æ°ãè¿œå ããŸãã ç»é¢è§£å床ãæž¡ãããã®æ§æã¯æ¬¡ã®ãšããã§ãã
var uniforms = {}; uniforms.resolution = {type:'v2',value:new THREE.Vector2(window.innerWidth,window.innerHeight)};
ååäžå€æ°ã«ã¯ã
ãš
ãå¿
èŠ
ã ãã®å Žåãããã¯ãŠã£ã³ããŠã®å¹
ãšé«ãã座æšãšãã2次å
ãã¯ãã«ã§ãã 次ã®è¡šïŒ
Three.jsããã¥ã¡ã³ãããååŸïŒã¯ãéä¿¡å¯èœãªãã¹ãŠã®ã¿ã€ãã®ããŒã¿ãšãã®èå¥åã瀺ããŠããŸãã
åäžãªæåå | ã¿ã€ãGLSL | Javascriptã¿ã€ã |
---|
'i', '1i'
| int
| Number
|
'f', '1f' | float
| Number
|
'v2'
| vec2
| THREE.Vector2
|
'v3'
| vec3
| THREE.Vector3
|
'c' | vec3
| THREE.Color
|
'v4' | vec4
| THREE.Vector4
|
'm3' | mat3
| THREE.Matrix3
|
'm4' | mat4
| THREE.Matrix4
|
't' | sampler2D
| THREE.Texture
|
't' | samplerCube
| THREE.CubeTexture |
ãããã·ã§ãŒããŒã«éä¿¡ããã«ã¯ããã¯ãã«ãè¿œå ããŠ
ShaderMaterial
ã®
ShaderMaterial
ã€ã³ã¹ã¿ã³ã¹ãå€æŽããŸãã
var material = new THREE.ShaderMaterial({uniforms:uniforms,fragmentShader:shaderCode})
ãŸã å®äºããŠããŸããïŒ ã·ã§ãŒããŒããã®å€æ°ãååŸããã®ã§ãããã§äœããããå¿
èŠããããŸãã åãšåãããã«ã°ã©ããŒã·ã§ã³ãäœæããŸãããã座æšãæ£èŠåããããã䜿çšããŠè²ã®å€ãäœæããŸãã
ã·ã§ãŒããŒã³ãŒãã次ã®ããã«å€æŽããŸãã
uniform vec2 resolution;// uniform- void main() { // vec2 pos = gl_FragCoord.xy / resolution.xy; // ! gl_FragColor = vec4(1.0,pos.x,pos.y,1.0); }
ãã®çµæãçŸããã°ã©ããŒã·ã§ã³ãåŸãããŸãïŒ
ãã©ãŒã¯ãäœæãã CodePenã§
ãããžã§ã¯ããç·šéã§ã
ãŸã ã
ã¿ã¹ã¯ïŒç»é¢ãç°ãªãè²ã®4ã€ã®çããéšåã«åå²ããŠã¿ãŸãã ãã®ãããªãã®ïŒ

ã¹ããã4ïŒããŒã¿ã®æŽæ°
ããŒã¿ãã·ã§ãŒããŒã«éä¿¡ããæ¹æ³ãåŠãã ã®ã¯è¯ãããšã§ãããããŒã¿ãæŽæ°ããå¿
èŠãããå Žåã¯ã©ãã§ããããïŒ ããšãã°ã
åã®äŸãæ°ããã¿ãã§éãããŠã£ã³ããŠã®ãµã€ãºãå€æŽããå Žåãã°ã©ããŒã·ã§ã³ã¯ä»¥åã®ç»é¢ãµã€ãºã䜿çšããããæŽæ°ãããŸããã
å€æ°ãæŽæ°ããã«ã¯ãéåžžãåäžå€æ°ãåã«åéä¿¡ãããŸãã ãã ããThree.jsã§ã¯ã
render
é¢æ°ã§uniformsãªããžã§ã¯ããæŽæ°ããã®ã¯éåžžã«ç°¡åã§ããã·ã§ãŒããŒã¯ããŒã¿ãå床éä¿¡ããå¿
èŠã¯ãããŸããã
å€æŽåŸã®ã¬ã³ããªã³ã°é¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
function render() { cube.rotation.y += 0.02; uniforms.resolution.value.x = window.innerWidth; uniforms.resolution.value.y = window.innerHeight; requestAnimationFrame( render ); renderer.render( scene, camera ); }
æ°ããCodePenã
éããŠãŠã£ã³ããŠã®ãµã€ãºãå€æŽãããšããã¥ãŒããŒãã®å
ã®ãµã€ãºãåããŸãŸã§ããã«ãããããããè²ãã©ã®ããã«å€åããããããããŸãã ããã«æ°ä»ãæãç°¡åãªæ¹æ³ã¯ãè§ã®è²ãèŠãŠãããããå€ãããªãããšã確èªããããšã§ãã
泚ïŒéåžžããããªããã»ããµãžã®ããŒã¿éä¿¡ã¯ã³ã¹ãã®ãããäœæ¥ã§ãããã¬ãŒã ããšã«è€æ°ã®å€æ°ãéä¿¡ããããšã¯éåžžã«æ£åžžã§ããããã¬ãŒã ããšã«æ°çŸã®å€æ°ãéä¿¡ãããšããã¬ãŒã ã¬ãŒãã倧å¹
ã«äœäžããŸããããã¯ããããããªãããã§ãããç»é¢äžã«æ°çŸã®ãªããžã§ã¯ãããããããããã¹ãŠã«ç°ãªãããããã£ã®ç
§æãé©çšããããšããã¹ãŠãããã«å¶åŸ¡äžèœã«ãªããŸããåŸã§ã·ã§ãŒããŒã®æé©åã«ã€ããŠåŠã³ãŸããã¿ã¹ã¯ïŒè²ãåŸã
ã«å€ããŠã¿ãŠãã ãããã¹ããã5ïŒãã¯ã¹ãã£ã®äœ¿çš
ãã¹ãŠã®ãã©ãããã©ãŒã ã§ã®èªã¿èŸŒã¿æ¹æ³ãšãã¯ã¹ãã£åœ¢åŒã«é¢ä¿ãªãããããã¯åäžãªå€æ°ãšããŠã·ã§ãŒããŒã«è»¢éãããŸããJavaScriptã§ã®ãã¡ã€ã«ã®ããŠã³ããŒãã«é¢ããå°ããªã¡ã¢ïŒå€éšURLããç»åãç°¡åã«ã¢ããããŒãã§ããŸãïŒããããŸãã«ç§ãã¡ãè¡ãããšã§ãïŒããã ããç»åãããŒã«ã«ã«ã¢ããããŒãããå ŽåãJavaScriptã¯éåžžã·ã¹ãã äžã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããªããããã¢ã¯ã»ã¹ã§ããªããããã¢ã¯ã»ã¹èš±å¯ã«åé¡ããããŸããæãç°¡åãªè§£æ±ºçã¯ãããŒã«ã«PythonãµãŒããŒãèµ·åããããšã§ããããã¯å®éã«ã¯æã£ãããç°¡åã§ããThree.jsã«ã¯ãç»åããã¯ã¹ãã£ãšããŠããŒãããããã®å°ããªäŸ¿å©ãªæ©èœããããŸãã THREE.ImageUtils.crossOrigin = '';
æåã®è¡ã¯äžåºŠã ãèšå®ãããŸããä»»æã®ç»åURLãæ¿å
¥ã§ããŸãã次ã«ããªããžã§ã¯ãã«ãã¯ã¹ãã£ãè¿œå ããå¿
èŠããããŸãuniforms
ã uniforms.texture = {type:'t',value:tex};
ãããŠæåŸã«ãã·ã§ãŒããŒã³ãŒãã§åäžå€æ°ã宣èšããé¢æ°ã䜿çšããŠä»¥åãšåãæ¹æ³ã§ãããæç»ããå¿
èŠããããŸãtexture2D
ã uniform vec2 resolution; uniform sampler2D texture; void main() { vec2 pos = gl_FragCoord.xy / resolution.xy; gl_FragColor = texture2D(texture,pos); }
ãèåã®åŒã䌞ã°ãããç»åãç»é¢ã«è¡šç€ºãããŸãïŒïŒããã¯ãã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ã§æšæºãã¹ãç»åã§ãããããåãããä¿¡å·ãšç»ååŠçç 究æïŒSIPIïŒåã«ãªãã©ã«ãã¢å€§åŠã¯ïŒãããã£ãŠãããã¯IPIã®ç¥ã瀺ããŠïŒãç§ãã¡ã¯ãã ã®ã°ã©ãã£ãã¯ã·ã§ãŒããå匷ããŠããã®ã§ãããã¯ãç§ãã¡ã«åããšæããŸãïŒïŒã¿ã¹ã¯ïŒãã¯ã¹ãã£ã®è²ããã«ã«ã©ãŒããã°ã¬ãŒã¹ã±ãŒã«ã«åŸã
ã«å€æŽããŠã¿ãŠãã ãããè¿œå ã®æé ïŒã·ã§ãŒããŒãä»ã®ãªããžã§ã¯ãã«é©çšãã
äœæããé£è¡æ©ã«ã¯ç¹å¥ãªãã®ã¯ãããŸãããã·ã§ãŒããŒããã¥ãŒãã«ãé©çšã§ããŸããå®éãåçŽã«ç·ãå¹³é¢ã®ãžãªã¡ããªã«çœ®ãæããããšãã§ããŸãã var geometry = new THREE.PlaneGeometry( 10, 10 );
ã«ïŒ
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
åºæ¥äžããããèåã¯ç«æ¹äœã«æãããŠããŸãïŒããªãã¯å察ãããããããŸããïŒãåŸ
ã£ãŠãã ãããããã¯ç«æ¹äœãžã®ãã¯ã¹ãã£ã®æ£ããæ圱ã§ã¯ãªãããã§ãïŒãããªãã¯æ£ããã§ãïŒã·ã§ãŒããŒãèŠããšãå®éã«åœŒã«ããã®ç»åã®ãã¹ãŠã®ãã¯ã»ã«ãç»é¢ã«é
眮ããããšäŒããŠããããšãããããŸãããã¥ãŒãäžã«ãããããšãã£ãŠãåã«ãã®å€åŽã®ãã¹ãŠã®ãã¯ã»ã«ãç Žæ£ãããããšãæå³ããŸãããã¥ãŒãã«ç©ççã«æãããããã«ãã¯ã¹ãã£ãé©çšãããå Žåã3Dãšã³ãžã³ã®çºæã«äŒŒãäœæ¥ã«ãªããŸãïŒ3Dãšã³ãžã³ãæ¢ã«äœ¿çšããŠããã®ã§ããããèŠæ±ããã ãã§ããªããã«ã«ãªããŸãïŒäž¡åŽã«åå¥ã«ãã¯ã¹ãã£ãæç»ããŸãïŒããã®ãã¥ãŒããªã¢ã«ã§ã¯ããã以å€ã®å Žåã¯äžå¯èœãªãã®ã«ã·ã§ãŒããŒã䜿çšããããããã®ãããªè©³çŽ°ã«ã¯è§ŠããŸããã ïŒè©³çŽ°ãç¥ãããå Žåã¯ãUdacity ã«3Dã°ã©ãã£ãã¯ã¹ã®åºç€ã«é¢ããåªããã³ãŒã¹ããããŸãïŒïŒæ¬¡ã®ã¹ããã
ãã®æ®µéã§ãShaderToyã§è¡ã£ãããšã¯ãã¹ãŠå®è¡ã§ããŸãããçŸåšã§ã¯ãä»»æã®ãã©ãããã©ãŒã ã§ä»»æã®ãã¯ã¹ãã£ãšãªããžã§ã¯ãã䜿çšã§ããŸããããããèªç±åºŠãããã°ããªã¢ã«ãªåœ±ãšå
æºãåããç
§æã·ã¹ãã ã®ãããªããšãã§ããŸããããã¯ä»¥äžã§è¡ããŸããããã«ãã·ã§ãŒããŒæé©åææ³ã«ã€ããŠã説æããŸããã·ã§ãŒããŒã®åºæ¬ãç¿åŸããã®ã§ãå®éã«ã¯ãããªããã»ããµã®ãã¯ãŒã䜿çšããŠãªã¢ã«ãªãã€ãããã¯ã©ã€ãã£ã³ã°ãäœæããŸãããã®æç¹ãããç¹å®ã®ãã©ãããã©ãŒã ã«çžãããããšãªããã°ã©ãã£ãã¯ã·ã§ãŒããŒã®äžè¬çãªæŠå¿µãæ€èšããŸãã ïŒäŸ¿å®äžããã¹ãŠã®ã³ãŒãäŸã¯åŒãç¶ãJavaScript / WebGLã䜿çšããŸããïŒéå§ããã«ã¯ãã·ã§ãŒããŒãå®è¡ããé©åãªæ¹æ³ãèŠã€ããŠãã ãããïŒJavaScript / WebGLãæãç°¡åãªæ¹æ³ã§ããããæ°ã«å
¥ãã®ãã©ãããã©ãŒã ã§å®éšããããšããå§ãããŸãïŒïŒç®æš
ãã®ãã¥ãŒããªã¢ã«ã®çµãããŸã§ã«ãç
§æã·ã¹ãã ã§ããŸãããã²ãŒããå§ããã ãã§ãªãããŒãããç¬èªã«äœæããããšãã§ããŸããæçµçµæã¯æ¬¡ã®ããã«ãªããŸãïŒã¯ãªãã¯ããŠã©ã€ãããªã³ã«ããŸãïŒãå€ãã®ã²ãŒã ãšã³ãžã³ã«ã¯æ¢è£œã®ç
§æã·ã¹ãã ããããŸããããã®äœææ¹æ³ãšç¬èªã®ç
§æã·ã¹ãã ãäœæããæ¹æ³ãç解ããããšã§ãã²ãŒã ã«ãŠããŒã¯ãªå€èŠ³ãäžããæ©äŒãå¢ããŸããããã«ãã·ã§ãŒããŒãšãã§ã¯ãã¯ãå粧ãã ãã§ãªããé©ãã¹ãæ°ããã²ãŒã ã¡ã«ãã¯ã¹ãžã®æãéããŸãïŒãã®è¯ãäŸãã¯ããã§ãããã¬ãŒã€ãŒã¯ããªã¢ã«ã¿ã€ã ã§äœæãããåçãªã·ã£ããŠã«æ²¿ã£ãŠå®è¡ã§ããŸããã¯ããã«ïŒéå§ã·ãŒã³
äžèšã§è©³çŽ°ã«èª¬æãããŠãããããåæã»ããã¢ããã§ã¯å€ãã®ããšãéããŸãããã¯ã¹ãã£ãã¬ã³ããªã³ã°ããåçŽãªãã©ã°ã¡ã³ãã·ã§ãŒãããå§ããŸããããããã§ã¯è€éãªããšã¯äœãèµ·ãããŸãããJavaScriptã³ãŒãã¯ã·ãŒã³ãèšå®ããã¬ã³ããªã³ã°ãšç»é¢ãµã€ãºã®ããã«ã·ã§ãŒããŒãã¯ã¹ãã£ãéä¿¡ããŸãã var uniforms = { tex : {type:'t',value:texture},
GLSLã³ãŒãã§ã¯ããããã®çµ±äžå€æ°ãââ宣èšããŠäœ¿çšããŸãã uniform sampler2D tex; uniform vec2 res; void main() { vec2 pixel = gl_FragCoord.xy / res.xy; vec4 color = texture2D(tex,pixel); gl_FragColor = color; }
ãã¯ã»ã«ã®åº§æšã䜿çšããŠãã¯ã¹ãã£ãã¬ã³ããªã³ã°ããåã«ãããããæ£èŠåããŸãããã¹ãŠã確å®ã«ç解ããããã«ãããã«å°ããªãŠã©ãŒã ã¢ããã¿ã¹ã¯ã瀺ããŸããã¿ã¹ã¯ïŒã¢ã¹ãã¯ãæ¯ãå€æŽããã«ãã¯ã¹ãã£ãã¬ã³ããªã³ã°ããŸãïŒèªåã§è©ŠããŠã¿ãŠãã ããã以äžã®ãœãªã¥ãŒã·ã§ã³ãèŠãŠãããŸãïŒããã¯ã¹ãã£ãåŒã䌞ã°ãããŠããçç±ã¯æããã§ããããã³ãã¯æ¬¡ã®ãšããã§ãã座æšãæ£èŠåããè¡ãèŠãŠãã ããã vec2 pixel = gl_FragCoord.xy / res.xy;
ã§é€ç®vec2
ãvec2
ãŸããããã¯ãåã
ã®ã³ã³ããŒãã³ããé€ç®ããããšã«äŒŒãŠããŸããèšãæãããšãäžèšã¯ä»¥äžãšåçã§ãã vec2 pixel = vec2(0.0,0.0)
xãšyãç°ãªãæ°ã«åå²ããŸãïŒç»é¢ã®å¹
ãšé«ãã§ïŒãåœç¶ãç»åã¯åŒã䌞ã°ãããŸããxãšy gl_FragCoord
ãxã ãã§é€ç®ãããšã©ããªãres
ãŸããïŒãããšããã ïŒç°¡åã«ããããã«ããã¥ãŒããªã¢ã«ã§ã¯ãæ£èŠåãããã³ãŒãã¯åããŸãŸã«ããŠãããŸããããã§äœãèµ·ãã£ãŠããã®ããææ¡ããŠãããšããã§ããããã¹ããã1ïŒå
æºãè¿œå ãã
é¢çœããã®ãäœæããåã«ãå
æºãå¿
èŠã§ãããå
æºãã¯ãã·ã§ãŒããŒã«æž¡ãããåãªããã€ã³ãã§ãããã®ç¹ã«ã€ããŠãæ°ãããŠããã©ãŒã ãäœæããŸãã var uniforms = {
ç»é¢äžã®ãœãŒã¹ã®äœçœ®ãšããŠãããã³radiusãšããŠ-ã®x
äž¡æ¹ã䜿çšããããã3次å
ã®ãã¯ãã«ãäœæããŸãããJavaScriptã§å
æºã«å€ãå²ãåœãŠãŸãããïŒy
z
uniforms.light.value.z = 0.2;
ååŸã¯ç»é¢ãµã€ãºã®å²åãšããŠäœ¿çšãããã0.2
ãç»é¢ã®20ïŒ
ã«ãªããŸããïŒãã®éžæã«é¢ããŠç¹å¥ãªããšã¯äœããããŸããããµã€ãºããã¯ã»ã«åäœã§èšå®ã§ããŸããGLSLã³ãŒãã§äœããéå§ãããŸã§ããã®æ°å€ã¯äœã®æå³ããããŸãããïŒããŠã¹äœçœ®ãååŸããã«ã¯ãã€ãã³ããªã¹ããŒãè¿œå ããã ãã§ãã ïŒïŒ document.onmousemove = function(event){
次ã«ãå
æºã®ãã®åº§æšãå©çšããã·ã§ãŒããŒã³ãŒããèšè¿°ããŸããããåçŽãªã¿ã¹ã¯ããå§ããŸããããå
æºã®ååŸå
ã®åãã¯ã»ã«ã衚瀺ãããæ®ããé»ã§ããããšã確èªããŠãã ãããGLSLã§ã¯ã次ã®ããã«ãªããŸãã uniform sampler2D tex; uniform vec2 res; uniform vec3 light;// uniform! void main() { vec2 pixel = gl_FragCoord.xy / res.xy; vec4 color = texture2D(tex,pixel); // float dist = distance(gl_FragCoord.xy,light.xy); if(light.z * res.x > dist){// , gl_FragColor = color; } else { gl_FragColor = vec4(0.0); } }
ããã§ã¯ã次ã®ããšãè¡ããŸããã- å
æºã®åäžå€æ°ã宣èšããŸããã
- çµã¿èŸŒã¿ã®è·é¢é¢æ°ã䜿çšããŠãå
æºãšçŸåšã®ãã¯ã»ã«éã®è·é¢ãèšç®ããŸããã
- ãã®è·é¢ïŒãã¯ã»ã«åäœïŒãç»é¢å¹
ã®20ïŒ
ãã倧ãããã©ããã確èªããŸãããããã§ããã°ããã¯ã»ã«ã®è²ãè¿ããããã§ãªããã°é»ãè¿ããŸãã
çãïŒå
æºã¯å¥åŠãªæ¹æ³ã§ããŠã¹ã«è¿œåŸããŸããã¿ã¹ã¯ïŒä¿®æ£ã§ããŸããïŒïŒä»¥äžã§ãã®åé¡ã解決ããåã«ãèªåã§ããäžåºŠè©ŠããŠã¿ãŠãã ãããïŒå
æºç§»åè£æ£
ããã§ãY軞ãå転ããŠããããšãèŠããŠãããããããŸããã次ã®ããã«å
¥åããã ãã§æ¥ãããšãã§ããŸãã light.y = res.y - light.y;
ããã¯æ°åŠçã«ã¯æ£ããã§ããããããããšã·ã§ãŒããŒã¯ã³ã³ãã€ã«ãããŸããïŒåé¡ã¯ãåäžå€æ°ãå€æŽã§ããªãããšã§ããçç±ãç解ããã«ã¯ããã®ã³ãŒããåã
ã®ãã¯ã»ã«ããšã«äžŠè¡ããŠå®è¡ãããããšãèŠããŠããå¿
èŠããããŸãããã¹ãŠã®ããã»ããµã³ã¢ãäžåºŠã«1ã€ã®å€æ°ãå€æŽããããšããããšãæ³åããŠãã ãããæªãç¶æ³ïŒãŠããã©ãŒã ã®ä»£ããã«æ°ããå€æ°ãäœæããããšã«ããããšã©ãŒãä¿®æ£ã§ããŸãããŸãã¯ããã«è¯ã- ããŒã¿ãã·ã§ãŒããŒã«è»¢éããåã«æ¬¡ã®æé ãå®è¡ã§ããŸãã uniforms.light.value.y = window.innerHeight - event.clientY;
ããã§ãã·ãŒã³ã®å¯èŠååŸãæ£åžžã«æ±ºå®ã§ããŸããããããã圌ã¯ããŸãã«ãéãèŠããŸã...ã°ã©ããŒã·ã§ã³ãè¿œå
ååŸã®å€åŽã§é»ã«åãæãã®ã§ã¯ãªãããšããžã«æ»ãããªã°ã©ããŒã·ã§ã³ãäœæããŠã¿ãŸããããããã¯ããã§ã«èšç®ããŠããè·é¢ã䜿çšããŠå®è¡ã§ããŸãããã¯ã¹ãã£ã«ã©ãŒã®ååŸå
ã®ãã¹ãŠã®ãã¯ã»ã«ãå²ãåœãŠã代ããã«ïŒ gl_FragColor = color;
ããã«è·é¢ä¿æ°ãæããããšãã§ããŸãïŒ gl_FragColor = color * (1.0 - dist/(light.z * res.x));
ããã¯dist
ãçŸåšã®ãã¯ã»ã«ãšå
æºã®éã®ãã¯ã»ã«åäœã®è·é¢ã§ããããæ©èœããŸãã(light.z * res.x)
ååŸã®é·ãã§ãããããã£ãŠãå
æºã®äžã®ãã¯ã»ã«ãæ£ç¢ºã«èŠããšãããdist
ã¯çãããªããŸã0
ãã€ãŸããä¹ç®color
ããŠ1
ãã«ã«ã©ãŒãååŸããŸãã
ãã®å³ã§ã¯dist
ãä»»æã®ãã¯ã»ã«ã«å¯ŸããŠèšç®ãããŸããdist
ã©ã®ãã¯ã»ã«ã«ãããã«ãã£ãŠå€åããå€ã¯light.z * res.x
äžå®ã§ããåã®å¢çã«ãããã¯ã»ã«ãèŠãdist
ãšãååŸã®é·ããšçãããªããŸããã€ãŸããçµæãšããŠãä¹ç®color
ã0
ãŠé»è²ãååŸããŸããã¹ããã2ïŒæ·±ããè¿œå ãã
ãããŸã§ã®ãšãããç¹å¥ãªããšã¯äœãããããã¯ã¹ãã£ã«ã°ã©ããŒã·ã§ã³ãã¹ã¯ãè¿œå ããŸããããã¹ãŠããŸã å¹³ãã«èŠããŸãããããä¿®æ£ããæ¹æ³ãç解ããããã«ãç
§æã·ã¹ãã ãçŸåšäœãããŠããã®ããèŠãŠãäœããã¹ãããšæ¯èŒããŸãããã
äžèšã®å Žåãç¹Aã¯å
æºããã®çäžã«ããããæã匷ãç¹ç¯ããBãšCã¯å®éã«ã¯åŽé¢ã«å
ç·ããªãããæããªããŸãããã ããããã«ç
§æã·ã¹ãã ã衚瀺ãããã®
ããããŸããã·ã¹ãã ãèæ
®ããå¯äžã®èŠçŽ ã¯xyå¹³é¢äžã®è·é¢ã§ããããããã¹ãŠã®ãã€ã³ãã¯åãæ¹æ³ã§åŠçãããŸããããããã®åãã€ã³ãã®é«ããå¿
èŠã ãšæããããããŸããããããã¯å®å
šã«çå®ã§ã¯ãããŸãããçç±ã確èªããã«ã¯ããã®å³ãæ€èšããŠãã ãã
ãAã¯å³ã®äžéšã«ãããBãšCã¯åŽé¢ã«ãããŸããDã¯å°çäžã®å¥ã®ãã€ã³ãã§ããAãšDãæãæãããDãæãã«å°éããããå°ãæããªãããšãããããŸããäžæ¹ãBãšCã¯å
æºããã®å
ã§ãããããã»ãšãã©å
ãå±ããªããããéåžžã«æãã¯ãã§ããé«ãã¯ãè¡šé¢ãå転ããæ¹åã»ã©éèŠã§ã¯ãããŸããããšåŒã°ããŸãè¡šé¢ã«å¯ŸããŠåçŽããããããã®æ
å ±ãã·ã§ãŒããŒã«è»¢éããæ¹æ³ã¯ïŒãããããåã
ã®ãã¯ã»ã«ããšã«èšå€§ãªæ°ã®æ°ã®é
åãéä¿¡ããããšã¯ã§ããŸãããïŒå®éããããè¡ããŸãïŒé
åã§ã¯ãªãããã¯ã¹ãã£ãšåŒã³ãŸããããã¯ãéåžžã®ããããäœããã®ã§ããïŒããã¯åã«ã®å€ç»åã§ããr
ãg
ãã€b
åç»çŽ ã«ã¯è²ãåã³æ¹åãè¡šããŸãã
äžã®å³ã¯ãåçŽãªæ³ç·ãããã瀺ããŠããŸããã¹ãã€ãããŒã«ã䜿çšãããšãããã©ã«ãã®æ¹åïŒããã©ãããïŒãè²ã§è¡šãããããšãããããŸãã(0.5, 0.5, 1)
ïŒç»åã®å€§éšåãå ããéïŒãããã¯ãŸã£ããäžãæãæ¹åã§ããxãyãããã³zã®å€ã¯ãrãgãããã³bã®å€ã«å²ãåœãŠãããŸããå³åŽã®åŸæåŽã¯å³ã«å転ããŠããããããã®xå€ã¯é«ããªããŸããxå€ã¯èµ€ã®å€ã§ããããããåŽé¢ãå°ãèµ€ã¿ã垯ã³ãŠããããã³ã¯ããã£ãŠããŸããåãããšãä»ã®ãã¹ãŠã®é¢ä¿è
ã«ãåœãŠã¯ãŸããŸãããããã¯ã¬ã³ããªã³ã°çšã§ã¯ãªãããããã®ãµãŒãã§ã¹ã®éåžžã®å€ããšã³ã³ãŒãããã ããªã®ã§ããããã¯ããããèŠããŸãããã®åçŽãªæ³ç·ãããããã¹ãçšã«ããŒãããŸãããïŒ var normalURL = "https://raw.githubusercontent.com/tutsplus/Beginners-Guide-to-Shaders/master/Part3/normal_maps/normal_test.jpg" var normal = THREE.ImageUtils.loadTexture(normalURL);
ãããŠããããäžæ§å€æ°ã®1ã€ãšããŠè¿œå ããŸãã var uniforms = { norm: {type:'t', value:normal},
æ£ããããŠã³ããŒãããããšã確èªããã«ã¯ãã³ãŒããGLSLã«å€æŽããŠããã¯ã¹ãã£ã®ä»£ããã«ã¬ã³ããªã³ã°ããŠã¿ãŸãïŒãã®æ®µéã§ã¯ãéåžžã®ãããã§ã¯ãªãèæ¯ãã¯ã¹ãã£ã®ã¿ã䜿çšããããšã«æ³šæããŠãã ããïŒãã¹ããã3ïŒç
§æã¢ãã«ãé©çšãã
è¡šé¢ã®æ³ç·ããŒã¿ãåŸãããã®ã§ãç
§æã¢ãã«ãå®è£
ããå¿
èŠããããŸããèšãæããã°ãæçµçãªæãããèšç®ããããã«å©çšå¯èœãªãã¹ãŠã®èŠå ãèæ
®ããæ¹æ³ãè¡šé¢ã«äŒããå¿
èŠããããŸããå®è£
ããæãç°¡åãªã¢ãã«ã¯Phongã¢ãã«ã§ããä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
æ³ç·ããŒã¿ãæã€ãµãŒãã§ã¹ããããšããŸããå
æºãšãµãŒãã§ã¹æ³ç·ã®éã®è§åºŠãåçŽã«èšç®ããŸããè§åºŠã
å°ããã»ã©ããã¯ã»ã«ã¯æãããªããŸããããã¯ãè§åºŠå·®ã0ã§ãããã¯ã»ã«ãå
æºã®çäžã«ãããšããæãæããããšãæå³ããŸããæãæããã¯ã»ã«ã¯ãå
æºãšåãæ¹åãæããŸãïŒããã¯ãªããžã§ã¯ãã®èé¢ã®ããã«èŠããŸãïŒããã®ã¢ãã«ãå®è£
ããŸããããæ€èšŒã«ã¯åçŽãªæ³ç·ãããã䜿çšããããããã¯ã¹ãã£ãåè²ã§å¡ãã€ã¶ãããŠããã¹ãŠãããŸããããã©ãããæ確ã«ç解ããŸãããããããã£ãŠã代ããã«ïŒ vec4 color = texture2D(...)
åè²ã®çœè²ïŒãŸãã¯ãã®ä»ã®è²ïŒãäœæããŸãããã vec4 color = vec4(1.0);
ããã¯ãvec4
ãã¹ãŠã®ã³ã³ããŒãã³ããçããGLSLãäœæããããã®éèšã§ã1.0
ãã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«ãªããŸãã- çŸåšã®ãã¯ã»ã«ã®æ³ç·ãã¯ãã«ãååŸããŸãã
- ã©ã€ãã®æ¹åãã¯ãã«ãååŸããŸãã
- ãã¯ãã«ãæ£èŠåããŸãã
- ãããã®éã®è§åºŠãèšç®ããŸãã
- æçµçãªè²ã«ãã®ä¿æ°ãæããŸãã
1.çŸåšã®ãã¯ã»ã«ã®æ³ç·ãã¯ãã«ãååŸãã
ãã®ãã¯ã»ã«ã«åœããå
ã®éãèšç®ã§ããããã«ãè¡šé¢ãã©ã®æ¹åã«ãèŠãããããç¥ãå¿
èŠããããŸãããã®æ¹åã¯æ³ç·ãããã«ä¿åããããããæ³ç·ãã¯ãã«ãååŸããã«ã¯ãæ³ç·ãã¯ã¹ãã£ã®çŸåšã®ãã¯ã»ã«ã®è²ãååŸããŸãã vec3 NormalVector = texture2D(norm,pixel).xyz;
ã¢ã«ãã¡å€ã¯æ³ç·ãããäžã§ã¯äœãæå³ããªããããæåã®3ã€ã®ã³ã³ããŒãã³ãã®ã¿ãå¿
èŠã§ãã2.å
ã®æ¹åãã¯ãã«ãååŸãã
次ã«ãå
ãã©ã®æ¹åãæããŠããããç¥ãå¿
èŠããããŸããç
§æé¢ã¯ãããŠã¹ã«ãŒãœã«ã®äœçœ®ã§ç»é¢ã«åããããæäžé»ç¯ã§ãããšæ³åã§ããŸãããããã£ãŠãå
æºãšãã¯ã»ã«éã®è·é¢ã䜿çšããã ãã§ãå
ã®æ¹åãã¯ãã«ãèšç®ã§ããŸãã vec3 LightVector = vec3(light.x - gl_FragCoord.x,light.y - gl_FragCoord.y,60.0)
ãŸããZ座æšãå¿
èŠã§ãïŒ3次å
ã®è¡šé¢æ³ç·ãã¯ãã«ã«å¯Ÿããè§åºŠãèšç®ã§ããããã«ããããïŒããã®å€ãè©Šãããšãã§ããŸããå°ããã»ã©ãæããéšåãšæãéšåã®ã³ã³ãã©ã¹ããã¯ã£ããããŠããããšãããããŸããããã¯ãã¹ããŒãžäžã®æäžé»ç¯ã®é«ãã§ãããšæ³åã§ããŸããé ãã«ããã»ã©ãå
ã¯ããåçã«åºãããŸãã3.ãã¯ãã«ã®æ£èŠå
次ã«ãæ£èŠåããå¿
èŠããããŸãã NormalVector = normalize(NormalVector)
äž¡æ¹ã®ãã¯ãã«ãé·ã1.0
ãæã€ããã«ãçµã¿èŸŒã¿ã®normalizeé¢æ°ã䜿çšããŸããããã¯ãã¹ã«ã©ãŒç©ã䜿çšããŠè§åºŠãèšç®ããããã«å¿
èŠã§ããä»çµã¿ãããããããªãå Žåã¯ãç·åœ¢ä»£æ°ã«ã€ããŠå°ãå匷ãã䟡å€ããããŸãããã®ç®çã®ããã«ãã¹ã«ã©ãŒç©ãåãé·ãã®ãã¯ãã«éã®è§åºŠã®ã³ãµã€ã³ãè¿ãããšãç¥ãå¿
èŠãããã ãã§ãã4.ãã¯ãã«éã®è§åºŠãèšç®ãã
çµã¿èŸŒã¿ã®ãããé¢æ°ã䜿çšããŠãããå®è¡ããŸãããã float diffuse = dot( NormalVector, LightVector )
ãã®çšèªã¯ã·ãŒã³ã®è¡šé¢ã«å°éããå
ã®éãå®çŸ©ããããããã®çšèªã¯Phongã©ã€ãã£ã³ã°ã¢ãã«ã§äœ¿çšããããããå€æ°diffuseãšåä»ããŸããã5.æçµçãªè²ã«ãã®ä¿æ°ãæããŸã
以äžã§ãã
次ã«ãè²ã«å€ãæããŸããdistanceFactor
æ¹çšåŒãèªã¿ãããããããã«å€æ°ãäœæããŸããã float distanceFactor = (1.0 - dist/(light.z * res.x)); gl_FragColor = color * diffuse * distanceFactor;
ãããŠãå®çšçãªç
§æã¢ãã«ãåŸãŸââããïŒïŒå¹æãããé¡èã«ãªãããã«ãå
æºã®ååŸã倧ããããŠã¿ãŠãã ãããïŒããŒããäœããééã£ãŠããããã§ãããœãŒã¹ãäœããã®åœ¢ã§åŸããŠããããã§ããèšç®ãããäžåºŠèŠãŠã¿ãŸããããã©ã€ããã¯ãã«ããããŸãã vec3 LightVector = vec3(light.x - gl_FragCoord.x,light.y - gl_FragCoord.y,60.0)
ç§ãã¡ãç¥ã£ãŠ(0, 0, 60)
ããããã«ãå
æºãçŸåšã®ãã¯ã»ã«ããäžã«ãããšãã«ç§ãã¡ã«äžãããã®ãæ£èŠååŸãããã¯çãããªã(0, 0, 1)
ãŸããæ倧ã®èŒåºŠãåŸãã«ã¯ãå
æºã«å³å¯ã«åããããæ³ç·ãå¿
èŠã§ããããšãå¿ããªãã§ãã ãããããã©ã«ãã®æ³ç·ãµãŒãã§ã¹ã¯äžåãã§ã(0.5, 0.5, 1)
ãã¿ã¹ã¯ïŒãœãªã¥ãŒã·ã§ã³ãäœã§ããããç解ããŠããŸããïŒå®è£
ã§ããŸããïŒåé¡ã¯ãè² ã®å€ãè²ã®å€ãšããŠãã¯ã¹ãã£ã«ä¿åã§ããªãããšã§ããå·Šåããã¯ãã«ããšããŠããŒã¯ããããšã¯ã§ããŸãã(-0.5, 0, 0)
ããããã£ãŠãæ³ç·ããããäœæãããšãã¯ããã¹ãŠã«è¿œå ããå¿
èŠããããŸã0.5
ãïŒãŸãã¯ãããäžè¬çã«ã¯ã座æšç³»ãã·ããããå¿
èŠããããŸãïŒããããã䜿çšããåã«ãåãã¯ã»ã«ããæžç®ããå¿
èŠãããããšãç¥ãããã«ããããç解ããå¿
èŠããããŸã0.5
ã以äž0.5
ã¯ãxããã³y座æšããæ³ç·ãã¯ãã«ãæžç®ããåŸã®ãã¢ã®æ§åã§ããå¥ã®ä¿®æ£ãè¡ãå¿
èŠããããŸããã¹ã«ã©ãŒç©ã¯è§åºŠã®ã³ãµã€ã³ãè¿ãããšã«æ³šæããŠãã ãããããã¯ãåºåã-1ãã1ã®ç¯å²ã«å¶éãããããšãæå³ããŸããè²ã®å€ãè² ã«ããããšã¯ã§ããŸããããŸããWebGLã¯è² ã®å€ãèªåçã«æåŠãããããå Žåã«ãã£ãŠã¯åäœããããããªããŸãããã®åé¡ã解決ããã«ã¯ãçµã¿èŸŒã¿ã®maxé¢æ°ã䜿çšããŠãããæå¹ã«ããŸãã float diffuse = dot( NormalVector, LightVector )
ããã«ïŒ float diffuse = max(dot( NormalVector, LightVector ),0.0)
ãããŠãå®çšçãªç
§æã¢ãã«ãåŸãŸââããïŒèæ¯ã«ç³ã®ãã¯ã¹ãã£ãé
眮ããGitHubã®ãã®ãã¥ãŒããªã¢ã«ã®ãªããžããªã«ããå®éã®æ³ç·ããããååŸããããšãã§ããŸãïŒã€ãŸããããïŒïŒ1è¡ã ããJavaScriptã«å€æŽããå¿
èŠããããŸãã var normalURL = "https://raw.githubusercontent.com/tutsplus/Beginners-Guide-to-Shaders/master/Part3/normal_maps/normal_test.jpg"
ã«ïŒ
var normalURL = "https://raw.githubusercontent.com/tutsplus/Beginners-Guide-to-Shaders/master/Part3/normal_maps/blocks_normal.JPG"
GLSLã®1è¡ïŒ vec4 color = vec4(1.0);
åè²ã®çœè²ã¯äžèŠã«ãªããŸããã次ã®ããã«å®éã®ãã¯ã¹ãã£ãããŒãããŸãã vec4 color = texture2D(tex,pixel)
ãããŠãæçµçµæã¯æ¬¡ã®ãšããã§ããæé©åã®ãã³ã
ãããªããã»ããµã¯éåžžã«å¹ççã«äœæ¥ãå®è¡ããŸãããäœãé
ããªãããç¥ãããšã¯éåžžã«éèŠã§ãã 以äžã«ããã€ãã®ææ¡ã瀺ããŸãã
åå²
ã·ã§ãŒããŒã§ã¯ãå¯èœãªå Žåã¯éåžžãåå²ãåé¿ããããšãæãŸããã§ããif
CPUã®ã³ãŒãã§ã¯å€ãã®ãã¶ã€ã³ãåé¡ã«ãªãããšã¯ãã£ãã«ãããŸãããããããªããã»ããµã®ã·ã§ãŒããŒã§ã¯ããã«ããã¯ã«ãªãå¯èœæ§ããããŸããçç±ãç解ããã«ã¯ãGLSLã³ãŒããç»é¢äžã®åãã¯ã»ã«ã«å¯ŸããŠäžŠåã«å®è¡ãããããšãæãåºããŠãã ãããã°ã©ãã£ãã¯ã¹ã«ãŒãã¯ããã¹ãŠã®ãã¯ã»ã«ãåãæäœãå®è¡ããå¿
èŠããããšããäºå®ã«åºã¥ããŠãå€ãã®æé©åãå®è¡ã§ããŸãããã ããcodeã«å€ãã®ã³ãŒããããå Žåif
ããã¯ã»ã«ããšã«ç°ãªãã³ãŒããå®è¡ããããããäžéšã®æé©åã¯å€±æããŸãããã¶ã€ã³ã¯ãããŸããif
å®è¡ãé
ããããã©ããã¯ãç¹å®ã®ããŒããŠã§ã¢ãšã°ã©ãã£ãã¯ã«ãŒãã®å®è£
ã«äŸåããŸãããã·ã§ãŒããŒãé«éåããå Žåã¯ãããããèŠããŠãããŠãã ãããé
延ã¬ã³ããªã³ã°
ããã¯ãç
§æãæ±ããšãã«éåžžã«äŸ¿å©ãªæŠå¿µã§ãã2ã€ã®å
æºã3ã€ããŸãã¯1ããŒã¹ãå¿
èŠã ãšæ³åããŠãã ãããåè¡šé¢ã®æ³ç·ãšå
æºã®åç¹ã®éã®è§åºŠãèšç®ããå¿
èŠããããŸãããã®çµæãã·ã§ãŒããŒã¯ã¿ãŒãã«é床ã§å®è¡ãããŸããé
延ã¬ã³ããªã³ã°ã¯ãã·ã§ãŒããŒã®äœæ¥ãè€æ°ã®ãã¹ã«åå²ããããšã«ããããã®ãããªããã»ã¹ãæé©åããæ¹æ³ã§ãããããäœãæå³ãããã詳ãã説æããŠããèšäºã§ããç§ãã¡ã«ãšã£ãŠéèŠãªéšåãåŒçšããŸããâ . .
ããšãã°ãå
æºã®ãã€ã³ãã®é
åãéä¿¡ãã代ããã«ããã¯ã¹ãã£äžã«åã®åœ¢ã§ããããæç»ã§ããŸããåã®åãã¯ã»ã«ã®è²ã¯å
ã®åŒ·åºŠãè¡šããŸãããã®ããã«ããŠãã·ãŒã³å
ã®ãã¹ãŠã®å
æºã®è€åå¹æãèšç®ãããããæçµçãªãã¯ã¹ãã£ïŒãŸãã¯åŒã°ããããšããããããã¡ïŒã«æž¡ãã ãã§ãã©ã€ãã£ã³ã°ãèšç®ã§ããŸããäœæ¥ãè€æ°ã®ãã¹ã«åå²ããæ©èœã¯ãã·ã§ãŒããŒãäœæãããšãã«éåžžã«äŸ¿å©ãªææ³ã§ããããšãã°ã液äœ/ç
ã·ã§ãŒããŒã ãã§ãªãããŒããå¹æã®èšç®ã§ã·ã§ãŒããŒãå éããããã«äœ¿çšãããŸãã次ã®ã¹ããã
å®çšçãªã©ã€ãã£ã³ã°ã·ã§ãŒããŒãã§ããã®ã§ã次ã®ããšãè©ŠããŠã¿ãŠãã ãããz
ç
§æãã¯ãã«ã®é«ãïŒå€ïŒãå€æŽããŠããã®å¹æã確èªããŠãã ããã- . ( , diffuse .)
- ambient ( ). ( , , . , , )
- WebGL . Babylon.js, Three.js, , GLSL. , - .
- GLSL Sandbox ShaderToy
åç
§è³æ
ãã®ãã¥ãŒããªã¢ã«ã®ç³ã®ãã¯ã¹ãã£ãšæ³ç·ãããã¯ãOpenGameArtïŒhttp ://opengameart.org/content/50-free-textures-4-normalmapsããååŸãããŸããæ³ç·ãããã®äœæã«åœ¹ç«ã€å€ãã®ããã°ã©ã ããããŸããç¬èªã®æ³ç·ãããã®äœæã«ã€ããŠè©³ããç¥ãããå Žåã¯ããã®èšäºã圹ç«ã¡ãŸãã