ã·ã§ãŒããŒã®æäœã®åºæ¬ãç¿åŸããã®ã§ãçŸå®çãªåçç
§æã®ã·ã¹ãã ãäœæããããšã«ãããGPUã®ãã«ãã¯ãŒãå®éã«æå¶ããããšããŸãã

ãã®ã·ãªãŒãºã®æåã®ã¬ãã¹ã³ã§ã¯
ãã°ã©ãã£ãã¯ã·ã§ãŒããŒã®
äœæã®åºæ¬ã«ã€ããŠèª¬æã
ãŸããã 2çªç®ã®æ¹æ³ã§ã¯ãä»»æã®ãã©ãããã©ãŒã ã«ã·ã§ãŒããŒãã»ããã¢ããããé
ã®ã¢ã¯ã·ã§ã³ã®
äžè¬çãªã¢ã«ãŽãªãºã ãç ç©¶ããŸããã ããã§ããã©ãããã©ãŒã ã«çžãããããšãªããã°ã©ãã£ãã¯ã·ã§ãŒããŒã®åéã®åºæ¬çãªæŠå¿µã«å¯ŸåŠããŸãã 䟿å®äžãäŸã§ã¯åŒãç¶ãJavaScript / WebGLã䜿çšããŸãã
å
ã«é²ãåã«ãã·ã§ãŒããŒãæäœããæã䟿å©ãªæ¹æ³ãéžæããŠãã ããã æãç°¡åãªãªãã·ã§ã³ã¯JavaScript / WebGLã§ããããæ°ã«å
¥ãã®ãã©ãããã©ãŒã ã§è©ŠããŠã¿ãããšããå§ãããŸãã
ç®æšãã®ã¬ãã¹ã³ã®çµãããŸã§ã«ãç
§æã·ã¹ãã ã®åäœåçãæ·±ãçè§£ã§ããããã«ãªãã ãã§ãªãããã®ãããªã·ã¹ãã ãæåããæåŸãŸã§äœæããŸãã
ãããæçµçµæã®è¡šç€ºæ¹æ³ã§ãïŒ
CodePenã«
ç§»åããŠç
§æãåãæ¿ããŸãïŒã

å€ãã®ã²ãŒã ãšã³ãžã³ã«ã¯ç
§æã·ã¹ãã ãçµã¿èŸŒãŸããŠããŸããããããã®äœæããã»ã¹ãçè§£ããããšã§ãããæè»ãªèšå®ãé©çšããã²ãŒã ããããŠããŒã¯ã«ããããšãã§ããŸãã ã·ã§ãŒããŒå¹æã®åœ¹å²ãçŽç²ã«è£
食çãªãã®ã«éå®ãã¹ãã§ã¯ãããŸãããæ°ããã²ãŒã ã®ä»çµã¿ãäœæããããã«äœ¿çšã§ããŸãã
ãã€ãããã¯ã©ã€ãã£ã³ã°ã®åªããäŸã¯
Chromaã§ãã
ã¯ããã«ïŒéå§ã·ãŒã³ãã®ãã¹ãŠã¯åã®ã¬ãã¹ã³ã§èª¬æããããã«ãã»ãšãã©ã®æºåãã¹ãããããŸãã ãã¯ã¹ãã£ã䜿çšããåçŽãªãã©ã°ã¡ã³ãã·ã§ãŒããŒããå§ããŸãããã

ãŸã ç¹å¥ãªããšã¯ãããŸããã 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); pixel.x = gl_FragCoord.x / res.x; pixel.y = gl_FragCoord.y / res.y;
xãšyãç°ãªãæ°ïŒç»é¢ã®å¹
ãšé«ãïŒã«åå²ããããããã¡ãããã¯ã¹ãã£ãåŒã䌞ã°ãããŸãã
ããããgl_FragCoordã®xãšyãx resã§å²ã£ãã ãã§ã¯ã©ããªããŸããïŒ ãŸãã¯ãéã«ãy resã®å€ã¯ïŒ
å®éšãç°¡åã«ããããã«ãã¬ãã¹ã³ã®æåŸãŸã§ãã®ãŸãŸã«ããŠãããŸãããã ããããäœããã®åœ¢ã§ãã³ãŒãå
ã§äœãèµ·ãã£ãŠããã®ãããããŠãã®çç±ãçè§£ããããšã¯éåžžã«éèŠã§ãã
ã¹ããã1.å
æºã远å ãããŸããå
æºã远å ããŸãã å
æºã¯ãã·ã§ãŒããŒã«éä¿¡ãããã€ã³ãã«ãããŸããã ãã®ãã€ã³ãã®æ°ããåäžå€æ°ãäœæããŸãã
var uniforms = {
xãšyã®å€ã䜿çšããŠç»é¢äžã®å
æºã®äœçœ®ã瀺ããzããã®ååŸãšããŠäœ¿çšããããã3ã€ã®ãã©ã¡ãŒã¿ãŒãæã€ãã¯ãã«ãäœæããŸããã
JavaScriptã³ãŒãã§å
æºã®å€ãèšå®ããŸãã
uniforms.light.value.z = 0.2;
ç»é¢ãµã€ãºã®20ïŒ
ã«å¯Ÿå¿ããååŸã0.2ã«èšå®ããŸãã ãã ããåäœã¯ç¹å¥ãªåœ¹å²ãæãããŸããããµã€ãºã¯ãã¯ã»ã«åäœã§èšå®ããããšãã§ããŸãã ããã¯ãGLSLã³ãŒãã«ãªããŸã§äœã«ã圱é¿ããŸããã
JavaScriptã³ãŒãã«ã€ãã³ããªã¹ããŒã远å ããŠãããŠã¹ã«ãŒãœã«ã®äœçœ®ã決å®ããŸãã
document.onmousemove = function(event){
次ã«ãå
æºãæ©èœãããããã®ã·ã§ãŒããŒã³ãŒããèšè¿°ããŸãã ç°¡åãªãã®ããå§ããŸããããã©ã€ãã®ååŸå
ã®ãã¹ãŠã®ãã¯ã»ã«ã衚瀺ãããä»ã®ãã¹ãŠã®ãã¯ã»ã«ãé»ã§ããããšã確èªããŸãã
GLSLã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
uniform sampler2D tex; uniform vec2 res; uniform vec3 light;
ã ããç§ãã¡ããã£ãããšã§ãïŒ
â¢å
æºã®åäžå€æ°ã宣èšããŸããã
â¢å
èµè·é¢æ©èœã䜿çšããŠãå
æºãšãã®ãã¯ã»ã«éã®è·é¢ã決å®ããŸããã
â¢è·é¢é¢æ°ã®å€ã確èªããŸããïŒãã¯ã»ã«åäœïŒã ç»é¢å¹
ã®20ïŒ
ãè¶
ããå Žåã¯ãæå®ããããã¯ã»ã«ã®è²ãè¿ããããã§ãªãå Žåã¯é»ãè¿ããŸãã

ã¢ã¯ã·ã§ã³ã§è¡šç€º
-CodePenã§ããã£ãšïŒ å
ã®åãã®è«çã«äœããééã£ãŠããããã§ãã
ã¿ã¹ã¯ïŒä¿®æ£ã§ããŸããïŒ ç¹°ãè¿ããŸããã以äžã®çããèŠãåã«èªåã§ãã£ãŠã¿ãŠãã ããã
å
ã®åããä¿®æ£ããæåã®ã¬ãã¹ã³ããèŠããŠããããã«ãããã§ã¯y軞ãå転ããŠããŸãã ããããæ¬¡ã®ããšãè¡ãã§ãããã
light.y = res.y - light.y;
ããã¯æ°åŠçãªèгç¹ããã¯çå®ã§ãããã·ã§ãŒããŒã¯ã³ã³ãã€ã«ãããŸããã å®éã«ã¯ãåäžå€æ°ã¯å€æŽã§ããŸããã èŠããŠãããŠãã ããïŒãã®ã³ãŒãã¯åãã¯ã»ã«ã«å¯ŸããŠäžŠè¡ããŠå®è¡ãããŸãã ãã¹ãŠã®ããã»ããµã³ã¢ãåäžã®å€æ°ãåæã«å€æŽããããšããŠããããšãæ³åããŠãã ããã è¯ããªãïŒ
ãã®å€æ°ã倿Žããã®ã§ã¯ãªããæ°ãã倿°ãäœæããããšã§åé¡ãä¿®æ£ã§ããŸãã ããã«è¯ãããšã«ãã·ã§ãŒããŒã«éä¿¡ããåã«ãããè¡ããŸãïŒ
CodePenã§ã¯ ããœãŒã¹ã³ãŒãã®ãã©ã³ããäœæããŠç·šéã§ããŸãã
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ã§ãããã®çµæããã¯ã»ã«ã®ãã«ã«ã©ãŒã«å¯Ÿå¿ãã1ãè²ã«ä¹ç®ããŸãã

ãã®å³ã§ã¯ãä»»æã®ãã¯ã»ã«ã®distãèšç®ãããŸãã distã®å€ã¯ã䜿çšããŠãããã¯ã»ã«ã«ãã£ãŠç°ãªããŸãããlight.z * res.xã®å€ã¯äžå®ã§ãã
åã®ç«¯ã«ãããã¯ã»ã«ã®å Žåãdistã¯åã®ååŸã«çãããããè²ã«0ãä¹ç®ããŸããããã¯é»ã«çžåœããŸãã
ã¹ããã2.æ·±ãã远å ããããã§ããã¯ã¹ãã£ã®ã°ã©ããŒã·ã§ã³ãã¹ã¯ãäœæããŸããã ãããããã¹ãŠããŸã å¹³ãã«èŠããŸãã ãããä¿®æ£ããæ¹æ³ãçè§£ããããã«ãç
§æã·ã¹ãã ãçŸåšäœãããŠããŠãååãšããŠäœããã¹ãããèŠãŠã¿ãŸãããã

ãã®å Žåãã»ã¯ã·ã§ã³Aã¯å
æºã®çäžã«äœçœ®ãããããã»ã¯ã·ã§ã³Aãæãæãããªããã»ã¯ã·ã§ã³Bãšã»ã¯ã·ã§ã³Cã¯å®éã«ã¯å
ãå
¥ããªãããæããªããŸãã
ãã ããç
§æã·ã¹ãã ã®åäœã¯æ¬¡ã®ãšããã§ãã

ç§ãã¡ãèæ
®ããå¯äžã®èŠçŽ ã¯xyå¹³é¢äžã®è·é¢ã§ããããããã¹ãŠã®åŽé¢ãçããç
§ããããŸãã åé¡ã解決ããã«ã¯ããããã®åãã€ã³ãã®é«ããç¥ãã ãã§ããããã«æãããããããŸããããããã¯å®å
šã«çå®ã§ã¯ãããŸããã æ¬¡ã®ç¶æ³ãèæ
®ããŠãã ããã

ã»ã¯ã·ã§ã³Aã¯ãããã¯ã®äžéšã§ãBãšCã¯ãã®åŽé¢ã§ãã D-ãããã¯è¿ãã®è¡šé¢ç©ã ã芧ã®ãšãããã»ã¯ã·ã§ã³AãšDã¯æãæããã¯ãã§ãããDã¯æãã«å
ãåœãããããå°ãæããªããŸãã BãšCã¯ãå
ãå®éã«ã¯åœãããªããããéåžžã«æããªããŸãã
é«ãã§ã¯ãªãã衚é¢ã®åé¢ã®æ¹åãç¥ãå¿
èŠãããããšãããããŸãã ããã¯ã衚é¢ã®
æ³ç·ãšåŒã°ããŸãã
ãããããã®ããŒã¿ãã·ã§ãŒããŒã«è»¢éããæ¹æ³ã¯ïŒ åã
ã®ãã¯ã»ã«ããšã«æ°åã®æ°å€ãæã€å·šå€§ãªé
åãéä¿¡ã§ããŸããïŒ å®éãããã¯ãŸãã«ç§ãã¡ããã£ãŠããããšã§ãïŒ é
åã®ã¿ããã¯ã¹ãã£ãšããŠæ©èœããŸãã
ããã¯æ³ç·ãããã§ããåãã¯ã»ã«ã®å€rãgãbãè²ã§ã¯ãªãæ¹åã瀺ãç»åã§ãã

äžèšã¯åçŽãªæ³ç·ãããã§ãã ã«ã©ãŒãã¬ããã䜿çšãããšãæšæºã®ããã©ãããæ¹åãè²ïŒ0.5ã0.5ã1ïŒã«å¯Ÿå¿ããŠããããšãããããŸããã€ãŸããç»åã®å€§éšåãå ããéè²ã§ãã éããã¯ã»ã«ã¯ãŸã£ããã«èŠããŸãã åãã¯ã»ã«ã®ãã¹ãŠã®rãgãbå€ã¯ãxãyãzå€ã«å€æãããŸãã
ããšãã°ããã³ã¯è²ã®æãã®é¢ãèŠãŠã¿ãŸãããã ããã¯ããããå³ã«åããããŠãããèµ€è²ã«å¯Ÿå¿ãã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ã¢ãã«ã§ãã ãããã®æ³ç·ãæã€ãã®ãããªè¡šé¢ããããšä»®å®ããŸãïŒ

å
æºãšè¡šé¢ã®æ³ç·ãšã®éã®è§åºŠãç°¡åã«èšç®ã§ããŸãã

è§åºŠãå°ããã»ã©ããã¯ã»ã«ã¯æãããªããŸãã
ã€ãŸããè§åºŠããŒãã®å
æºã®çäžã«ãããã¯ã»ã«ãæãæãããªããŸãã ãããŠæãæãã®ã¯ããªããžã§ã¯ãã®èé¢ã«ãããã¯ã»ã«ã§ãã
ããã§ããã¹ãã«åçŽãªæ³ç·ãããã䜿çšããŠããããããã¯ã¹ãã£ã«åè²ãé©çšããŸãã æ¬¡ã«ãç
§æã·ã¹ãã ãæ©èœããŠãããã©ããã確èªããŸãã
代ããã«ïŒ
vec4 color = texture2D(...);
åè²ã®çœè²ãäœæããŸãïŒãŸãã¯ä»ã®ä»»æã®è£éã§ïŒïŒ
vec4 color = vec4(1.0);
ãã®GLSLã®åæžã¯ã1.0ã«çãããã¹ãŠã®ã³ã³ããŒãã³ãã§vec4ãäœæããããã«å¿
èŠã§ãã
ã¢ã¯ã·ã§ã³ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«ãªããŸãã
1.ãã®ãã¯ã»ã«ã§æ³ç·ãã¯ãã«ãååŸããŸãã
2.ã©ã€ãã®æ¹åãã¯ãã«ãååŸããŸãã
3.ãã¯ãã«ãæ£èŠåããŸãã
4.ãã¯ãã«éã®è§åºŠãèæ
®ããŸãã
5.æçµçãªè²ã«ãã®ä¿æ°ãæããŸãã
1.ãã®ãã¯ã»ã«ã§æ³ç·ãã¯ãã«ãååŸãããã®ãã¯ã»ã«ã«å
¥å°ããå
ã®éãæ±ºå®ããããã«ã衚é¢ã®åé¢ã®æ¹åãç¥ãå¿
èŠããããŸãã ãã®æ¹åã¯æ³ç·ãããã«ä¿åãããŠãããããæ³ç·ãã¯ã¹ãã£äžã®ç¹å®ã®ãã¯ã»ã«ã®è²ãèªèããããšã§æ³ç·ãã¯ãã«ãååŸã§ããŸãã
vec3 NormalVector = texture2D(norm,pixel).xyz;
ã¢ã«ãã¡å€ã¯æ³ç·ãããã®ã©ã®èŠçŽ ã«ãé¢äžããªããããæåã®3ã€ã®ã³ã³ããŒãã³ãã®ã¿ãå¿
èŠã§ãã
2.å
ã®æ¹åãã¯ãã«ãååŸããæ¬¡ã«ãå
æºã®æ¹åã確èªããå¿
èŠããããŸãã ããŠã¹ã«ãŒãœã«ã眮ãããŠããå Žæã®ç»é¢ã®åã§ãããªã³ã°ããæäžé»ç¯ãšããŠæ³åããŠãã ããã å
æºãšãã®ãã¯ã»ã«éã®è·é¢ã䜿çšããŠãå
ã®æ¹åãã¯ãã«ã決å®ã§ããŸãã
vec3 LightVector = vec3(light.x - gl_FragCoord.x,light.y - gl_FragCoord.y,60.0);
ãŸãã3次å
ã®æ³ç·ãã¯ãã«ã«å¯Ÿããè§åºŠã決å®ããããã«ãz座æšãå¿
èŠã§ãã å€ã倿ŽããŠã¿ãŠãã ãããå€ãå°ããã»ã©ãæãéšåãšæããéšåã®ã³ã³ãã©ã¹ããã¯ã£ããããŠããŸãã ã¹ããŒãžã®äžã§æäžé»ç¯ãä¿æããé«ããšèããŠãã ãããé ãã«ããã»ã©ãå
ã¯ããåçã«åé
ãããŸãã
3.ãã¯ãã«ã®æ£èŠå NormalVector = normalize(NormalVector); LightVector = normalize(LightVector);
çµã¿èŸŒã¿ã®
normalize颿°ã䜿çšããŠãäž¡æ¹ã®ãã¯ãã«ã®é·ãã1.0ã§ããããšã確èªããŸãã ããã¯ãã¹ã«ã©ãŒç©ïŒ
ãããç© ïŒã䜿çšããŠè§åºŠãèšç®ããå¿
èŠãããããå¿
èŠã§ãã ãããã©ã®ããã«æ©èœããããå®å
šã«ã¯ããããªãå Žåã¯ãç·åœ¢ä»£æ°ã®ç¥èãåäžããããšãã§ãã ãã ãããã®å Žåãã¹ã«ã©ãŒç©ãåãé·ãã®2ã€ã®ãã¯ãã«éã®è§åºŠã®ã³ãµã€ã³ãè¿ãããšãç¥ãã ãã§æžã¿ãŸãã
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ãæžç®ããå¿
èŠãããããšã«æ³šæããŠãã ããã
以äžã¯ãæ³ç·ãã¯ãã«ã®xå€ãšyå€ãã0.5ãåŒããçµæã§ãã

ä¿®æ£ãã¹ãããšã¯1ã€ã ãã§ãã ã¹ã«ã©ãŒç©ã¯è§åºŠã®ã³ãµã€ã³ãè¿ããããçµæã®å€ã¯-1ã1ã®ç¯å²ã«ãªããŸãããã ããè² ã®è²ã®å€ã¯å¿
èŠãããŸããã WebGLã¯èªåçã«è² ã®å€ãæåŠããŸãããåé¡ã¯ã©ããã§çºçããå¯èœæ§ããããŸãã çµã¿èŸŒã¿ã®max颿°ã䜿çšããŠãããã倿ŽããŸãã
float diffuse = dot( NormalVector, LightVector );
ããã«ïŒ
float diffuse = max(dot( NormalVector, LightVector ),0.0);
ããã§å®çšçãªç
§æã¢ãã«ã宿ããŸããïŒ
ãã¯ã¹ãã£ãç³ã§æ»ãããšãã§ããŸãã éåžžã®ãããã¯
ãGitHubã®ãªããžããªã§å
¥æã§ã
ãŸã ïŒãŸãã¯çŽæ¥ãªã³ã¯ããŠ
ãã ãã ïŒã
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ã³ãŒãã®æ¬¡ã®è¡ïŒ
vec4 color = vec4(1.0);
ãã¯ã¹ãã£ãåè²ã®çœãè²ã«çœ®ãæããïŒ
vec4 color = texture2D(tex,pixel);
æåŸã«ãçµæã¯æ¬¡ã®ãšããã§ãã
prntscr.com/auy52hCodePenã§ã¯ ããœãŒã¹ã³ãŒãã®ãã©ã³ããäœæããŠç·šéã§ããŸãã
æé©åã®ãã³ãGPUã¯éåžžã«å¹ççã§ãããGPUã®åäœã劚ããèŠå ãç¥ãããšã¯æçšã§ãã ããã€ãã®ç°¡åãªãã³ããæ¬¡ã«ç€ºããŸãã
åå²ã·ã§ãŒããŒã䜿çšããå Žåã¯ãå¯èœãªéãåå²ãé¿ããã®ãæåã§ãã CPUã®ã³ãŒãã䜿çšããå Žåãå€ãã®ifã¹ããŒãã¡ã³ããå¿é
ããå¿
èŠã¯ã»ãšãã©ãããŸããã ããããGPUã«ãšã£ãŠã¯ãæ·±å»ãªé害ã«ãªãå¯èœæ§ããããŸãã
çç±ãçè§£ããããã«ãGLSLã³ãŒãã¯ç»é¢äžã®åã
ã®ãã¯ã»ã«ããšã«äžŠè¡ããŠå®è¡ãããããšãæãåºããŸãã ãã¹ãŠã®ãã¯ã»ã«ã§åãæäœãå¿
èŠãªå Žåããããªã«ãŒãã®æäœã倧å¹
ã«æé©åã§ããŸãã ã³ãŒãå
ã«å€æ°ã®ifæãããå Žåããã¯ã»ã«ããšã«ç°ãªãã³ãŒããå®è¡ããå¿
èŠããããããæé©åãäœäžããå¯èœæ§ããããŸãã ãã¡ãããããã¯ç¹å®ã®ã³ã³ããŒãã³ãã®ç¹æ§ãããã³ãããªã«ãŒãã䜿çšããæ©èœã«äŸåããŸãã ããããã·ã§ãŒããŒãé«éåããããã«ãããèŠããŠãããšäŸ¿å©ã§ãã
é
å»¶ã¬ã³ããªã³ã°ããã¯ãç
§æãæ±ãã®ã«éåžžã«äŸ¿å©ãªãã¯ããã¯ã§ãã 1ã€ã®å
æºã§ã¯ãªãã2ã3ããŸãã¯10ã®å
æºãäœæããå Žåãæ³åããŠãã ããããµãŒãã§ã¹ã®åæ³ç·ãšåå
æºã®éã®è§åºŠãèšç®ããå¿
èŠããããŸãã ããã«ãããã·ã§ãŒããŒã®é床ãéåžžã«éãäœäžããŸãã é
å»¶ã¬ã³ããªã³ã°ã¯ãã·ã§ãŒããŒã®äœæ¥ãè€æ°ã®åãã«åå²ããããšã«ããããããä¿®æ£ããã®ã«åœ¹ç«ã¡ãŸãã
ãã®èšäºã§ã¯ããã®åé¡ã«ã€ããŠè©³ãã説æããŸãã ããã§ã¯ããã®ã¬ãã¹ã³ã®ãããã¯ã«é¢ããæçã®ã¿ã瀺ããŸãã
ãç
§æã¯ãããããã®éçºãã¹ãéžæããäž»ãªçç±ã§ãã æšæºã®å¯èŠåãã€ãã©ã€ã³ã§ã¯ãç
§æã«é¢é£ãããã¹ãŠã®èšç®ã¯ãå
æºããšã«ãåé ç¹ããã³å¯èŠã·ãŒã³ã®åãã©ã°ã¡ã³ãã§å®è¡ããå¿
èŠããããŸãã
ããšãã°ãå
ã®ç¹ã®é
åãéä¿¡ãã代ããã«ããããããã¯ã¹ãã£äžã«åãšããŠé
眮ã§ããŸããåãã¯ã»ã«ã®è²ã¯å
ã®åŒ·åºŠã瀺ããŸãã ãããã£ãŠãã·ãŒã³å
ã®ãã¹ãŠã®å
æºã®åèšå¹æãèšç®ãããã®æçµãã¯ã¹ãã£ïŒãŸãã¯ãããã¡ãšãåŒã°ããïŒã®ã¿ãéä¿¡ããããã«åºã¥ããŠã©ã€ãã£ã³ã°ãèšç®ã§ããŸãã
ã·ã§ãŒããŒã®äœæ¥ãè€æ°ã®åãã«åå²ããããšã¯éåžžã«äŸ¿å©ãªãã¯ããã¯ã§ãã ãŒããå¹æãæ°Žãç
ãäœæããããã«åºã䜿çšãããŠããŸãã é
å»¶ã¬ã³ããªã³ã°ã¯ãã®ã¬ãã¹ã³ã®ãããã¯ã«ã¯åããŸããããæ¬¡ã®ã¬ãã¹ã³ã§èª¬æããŸãïŒ
ãããªãã¹ãããäœæ¥çšã®ç
§æã·ã§ãŒããŒãã§ããã®ã§ã次ã詊ãããšãã§ããŸãã
â¢å
ãã¯ãã«ã®é«ãïŒzå€ïŒã倿ŽããŠãå
ãã¯ãã«ãçæãã广ã確èªããŸãã
â¢å
ã®åŒ·åºŠã倿ŽããŸãã ããã¯ãæ¡æ£ã³ã³ããŒãã³ãã«ä¿æ°ãæããããšã§å®è¡ã§ããŸãã
â¢å
ãèšç®ããããã®æ¹çšåŒã«åšå²æåã远å ããŸãã ããã¯ãã·ãŒã³ã«æå°éã®ïŒåæïŒç
§æã远å ããŠããããªã¢ã«ã«äœæããããšãæå³ããŸãã å®éã®ç掻ã§ã¯ãæå°éã®å
ãã©ã®è¡šé¢ã«ãåœãããããçµ¶å¯Ÿã«æãç©äœã¯ãããŸããã
â¢ãã®
WebGLãã¥ãŒããªã¢ã«ã§èª¬æãããŠ
ããã·ã§ãŒããŒã®ãããããäœæããŠã¿
ãŠãã ãã
ã ãããã¯Three.jsã§ã¯ãªãBabylon.jsã«åºã¥ããŠããŸãããGLSLèšå®ã«ããã«ã¢ã¯ã»ã¹ã§ããŸãã ç¹ã«ãã»ã«ã·ã§ãŒãã£ã³ã°ãšãã©ã³ã·ã§ãŒãã£ã³ã°ã«èå³ããããããããŸããã
â¢
GLSL Sandboxãš
ShaderToyã®è峿·±ãäœåã
ã芧ãã ããåç
§è³æãã®ãã¥ãŒããªã¢ã«ã§äœ¿çšããç³ã®ãã¯ã¹ãã£ãšæ³ç·ãããã¯ã
OpenGameArt Webãµã€ãããååŸãããã®ã§ãã ãšããããæ³ç·ããããäœæããããã®å€ãã®ããã°ã©ã ããããŸãã æ³ç·ãããã®äœææ¹æ³ã«ã€ããŠè©³ããç¥ãããå Žåã¯ã
ãã®èšäºãåç
§ã
ãŠãã ããã