WebGLãã€ãã©ã€ã³çµ±èšåéãæ·±æãããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãžã®ã¢ã¯ã»ã¹ãšè§£éã解説ãå®çšçãªç¥èŠã§WebGLã¢ããªãæé©åããŸãã
WebGLãã€ãã©ã€ã³çµ±èšåéïŒã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãè§£ãæãã
WebããŒã¹ã®3Dã°ã©ãã£ãã¯ã¹ã®äžçã§ã¯ãããã©ãŒãã³ã¹ãæãéèŠã§ããè€éãªã²ãŒã ãããŒã¿å¯èŠåããŒã«ããŸãã¯ã€ã³ã¿ã©ã¯ãã£ããªè£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒãæ§ç¯ããŠããå Žåã§ããã¹ã ãŒãºã§å¹ççãªã¬ã³ããªã³ã°ãä¿èšŒããããšã¯ãè¯å¥œãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ãšã£ãŠäžå¯æ¬ ã§ããWebGLã¯ããã©ã°ã€ã³ã䜿çšããã«äºææ§ã®ããWebãã©ãŠã¶å ã§ã€ã³ã¿ã©ã¯ãã£ããª2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®JavaScript APIã§ããã匷åãªæ©èœãæäŸããŸããããã®ããã©ãŒãã³ã¹ã®åŽé¢ããã¹ã¿ãŒããã«ã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãšããã«åœ±é¿ãäžããèŠå ã«ã€ããŠã®æ·±ãçè§£ãå¿ èŠã§ãã
WebGLã¢ããªã±ãŒã·ã§ã³ãæé©åããããã®æã䟡å€ã®ããããŒã«ã®äžã€ã¯ããã€ãã©ã€ã³çµ±èšãåéã»åæããèœåã§ãããããã®çµ±èšã¯ãã¬ã³ããªã³ã°ããã»ã¹ã®æ§ã ãªåŽé¢ã«é¢ããæŽå¯ãæäŸããéçºè ãããã«ããã¯ãæ¹åã®äœå°ãããé åãç¹å®ã§ããããã«ããŸãããã®èšäºã§ã¯ãWebGLãã€ãã©ã€ã³çµ±èšåéã®è€éããæãäžãããããã®ã¡ããªã¯ã¹ã«ã¢ã¯ã»ã¹ããæ¹æ³ããã®æå³ãè§£éããæ¹æ³ããããŠãããã䜿çšããŠWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããæ¹æ³ã«ã€ããŠèª¬æããŸãã
WebGLãã€ãã©ã€ã³çµ±èšãšã¯ïŒ
WebGLãã€ãã©ã€ã³çµ±èšã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³å ã®æ§ã ãªæäœã远跡ããäžé£ã®ã«ãŠã³ã¿ãŒã§ããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã¯ã3Dã¢ãã«ãšãã¯ã¹ãã£ãç»é¢ã«è¡šç€ºãããæçµçãª2Dç»åã«å€æããäžé£ã®ã¹ããŒãžã§ããåã¹ããŒãžã«ã¯èšç®ãšããŒã¿è»¢éãå«ãŸããŠãããåã¹ããŒãžã§ã®ã¯ãŒã¯ããŒããçè§£ããããšã§ãããã©ãŒãã³ã¹ã®éçãæããã«ããããšãã§ããŸãã
ãããã®çµ±èšã¯ã以äžã«é¢ããæ å ±ãæäŸããŸãïŒ
- é ç¹åŠçïŒ åŠçãããé ç¹ã®æ°ãé ç¹ã·ã§ãŒããŒã®åŒã³åºãåæ°ãé ç¹å±æ§ã®ãã§ããåæ°ã
- ããªããã£ãã¢ã»ã³ããªïŒ ã¢ã»ã³ãã«ãããããªããã£ãïŒäžè§åœ¢ãç·ãç¹ïŒã®æ°ã
- ã©ã¹ã¿ã©ã€ãºïŒ çæããããã©ã°ã¡ã³ãïŒãã¯ã»ã«ïŒã®æ°ããã©ã°ã¡ã³ãã·ã§ãŒããŒã®åŒã³åºãåæ°ã
- ãã¯ã»ã«æäœïŒ ãã¬ãŒã ãããã¡ã«æžã蟌ãŸãããã¯ã»ã«æ°ãå®è¡ãããæ·±åºŠã»ã¹ãã³ã·ã«ãã¹ãã®åæ°ã
- ãã¯ã¹ãã£æäœïŒ ãã¯ã¹ãã£ã®ãã§ããåæ°ããã¯ã¹ãã£ãã£ãã·ã¥ãã¹ã®åæ°ã
- ã¡ã¢ãªäœ¿çšéïŒ ãã¯ã¹ãã£ããããã¡ããã®ä»ã®ãªãœãŒã¹ã«å²ãåœãŠãããã¡ã¢ãªéã
- ãããŒã³ãŒã«ïŒ çºè¡ãããåå¥ã®ã¬ã³ããªã³ã°ã³ãã³ãã®æ°ã
ãããã®çµ±èšãç£èŠããããšã§ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®åäœãå æ¬çã«ææ¡ãããªãœãŒã¹ãéå°ã«æ¶è²»ãããŠããé åãç¹å®ã§ããŸãããã®æ å ±ã¯ãæé©åæŠç¥ã«ã€ããŠæ å ±ã«åºã¥ããæææ±ºå®ãè¡ãããã«äžå¯æ¬ ã§ãã
ãªãWebGLãã€ãã©ã€ã³çµ±èšãåéããã®ãïŒ
WebGLãã€ãã©ã€ã³çµ±èšãåéããããšã«ã¯ãããã€ãã®å©ç¹ããããŸãïŒ
- ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ïŒ ã¬ã³ããªã³ã°ãã€ãã©ã€ã³å ã§æãå€ãã®ãªãœãŒã¹ïŒCPUãŸãã¯GPUæéïŒãæ¶è²»ããŠããã¹ããŒãžãç¹å®ããŸãã
- ã·ã§ãŒããŒã®æé©åïŒ ã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ãåæããã³ãŒããç°¡çŽ åãŸãã¯æé©åã§ããé åãç¹å®ããŸãã
- ãããŒã³ãŒã«ã®åæžïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ããããåŠçãªã©ã®ãã¯ããã¯ãéããŠãããŒã³ãŒã«ã®æ°ãåæžã§ãããã©ããã倿ããŸãã
- ãã¯ã¹ãã£äœ¿çšã®æé©åïŒ ãã¯ã¹ãã£ã®ãã§ããããã©ãŒãã³ã¹ãè©äŸ¡ãããã¯ã¹ãã£ãµã€ãºãåæžãããããããããã³ã°ã䜿çšãããããæ©äŒãç¹å®ããŸãã
- ã¡ã¢ãªç®¡çã®æ¹åïŒ ã¡ã¢ãªäœ¿çšéãç£èŠããŠãã¡ã¢ãªãªãŒã¯ãé²ããå¹ççãªãªãœãŒã¹å²ãåœãŠãä¿èšŒããŸãã
- ã¯ãã¹ãã©ãããã©ãŒã äºææ§ïŒ ç°ãªãããã€ã¹ããã©ãŠã¶ã§ããã©ãŒãã³ã¹ãã©ã®ããã«ç°ãªãããçè§£ããŸãã
äŸãã°ãåŠçãããé ç¹ã®æ°ã«å¯ŸããŠãã©ã°ã¡ã³ãã·ã§ãŒããŒã®åŒã³åºãåæ°ãå€ãå Žåãããã¯é床ã«è€éãªãžãªã¡ããªãæç»ããŠãããããã©ã°ã¡ã³ãã·ã§ãŒããŒãé«äŸ¡ãªèšç®ãå®è¡ããŠããããšã瀺ããŠããå¯èœæ§ããããŸããéã«ããããŒã³ãŒã«ã®åæ°ãå€ãå Žåã¯ãã¬ã³ããªã³ã°ã³ãã³ãã广çã«ãããåŠçããŠããªãããšã瀺åããŠãããããããŸããã
WebGLãã€ãã©ã€ã³çµ±èšã®åéæ¹æ³
æ®å¿µãªãããWebGL 1.0ã¯ãã€ãã©ã€ã³çµ±èšã«ã¢ã¯ã»ã¹ããããã®çŽæ¥çãªAPIãæäŸããŠããŸãããããããWebGL 2.0ããã³WebGL 1.0ã§å©çšå¯èœãªæ¡åŒµæ©èœã¯ããã®è²ŽéãªããŒã¿ãåéããæ¹æ³ãæäŸããŸãã
WebGL 2.0ïŒã¢ãã³ãªã¢ãããŒã
WebGL 2.0ã¯ãããã©ãŒãã³ã¹ã«ãŠã³ã¿ãŒãçŽæ¥ã¯ãšãªããããã®æšæºåãããã¡ã«ããºã ãå°å ¥ããŠããŸããããã¯ãã¿ãŒã²ãããªãŒãã£ãšã³ã¹ãäž»ã«WebGL 2.0äºæãã©ãŠã¶ïŒã»ãšãã©ã®ææ°ãã©ãŠã¶ã¯WebGL 2.0ããµããŒãããŠããŸãïŒã䜿çšããŠããå Žåã«æšå¥šãããã¢ãããŒãã§ãã
以äžã«ãWebGL 2.0ã§ãã€ãã©ã€ã³çµ±èšãåéããæ¹æ³ã®åºæ¬çãªæŠèŠã瀺ããŸãïŒ
- WebGL 2.0ã®ãµããŒãã確èªïŒ ãŠãŒã¶ãŒã®ãã©ãŠã¶ãWebGL 2.0ããµããŒãããŠããããšã確èªããŸãã
- WebGL 2.0ã³ã³ããã¹ããäœæïŒ
getContext("webgl2")ã䜿çšããŠWebGL 2.0ã¬ã³ããªã³ã°ã³ã³ããã¹ããååŸããŸãã EXT_disjoint_timer_query_webgl2æ¡åŒµæ©èœãæå¹åïŒå¿ èŠãªå ŽåïŒïŒ äžè¬çã«å©çšå¯èœã§ãããç°ãªãããŒããŠã§ã¢ããã©ã€ãéã§ã®äºææ§ã確ä¿ããããã«ãæ¡åŒµæ©èœã確èªããŠæå¹ã«ããããšãæšå¥šãããŸããããã¯éåžžã`gl.getExtension('EXT_disjoint_timer_query_webgl2')`ã䜿çšããŠè¡ãããŸãã- ã¿ã€ããŒã¯ãšãªãäœæïŒ
gl.createQuery()ã¡ãœããã䜿çšããŠã¯ãšãªãªããžã§ã¯ããäœæããŸããåã¯ãšãªãªããžã§ã¯ãã¯ç¹å®ã®ããã©ãŒãã³ã¹ã¡ããªãã¯ã远跡ããŸãã - ã¯ãšãªã®éå§ãšçµäºïŒ 枬å®ãããã¬ã³ããªã³ã°ã³ãŒãã
gl.beginQuery()ãšgl.endQuery()åŒã³åºãã§å²ã¿ãŸããã¿ãŒã²ããã®ã¯ãšãªã¿ã€ãïŒäŸïŒgl.TIME_ELAPSEDïŒãæå®ããŸãã - ã¯ãšãªçµæã®ååŸïŒ ã¬ã³ããªã³ã°ã³ãŒããå®è¡ãããåŸã
gl.getQueryParameter()ã¡ãœããã䜿çšããŠã¯ãšãªãªããžã§ã¯ãããçµæãååŸããŸããã¯ãšãªãå©çšå¯èœã«ãªããŸã§åŸ ã€å¿ èŠããããããã«ã¯éåžžãã¬ãŒã ã®å®äºãåŸ ã€å¿ èŠããããŸãã
äŸïŒæŠå¿µïŒïŒ
```javascript const canvas = document.getElementById('myCanvas'); const gl = canvas.getContext('webgl2'); if (!gl) { console.error('WebGL 2.0ã¯ãµããŒããããŠããŸããïŒ'); // WebGL 1.0ã«ãã©ãŒã«ããã¯ãããããšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãã return; } // æ¡åŒµæ©èœã確èªããŠæå¹åïŒå¿ èŠãªå ŽåïŒ const ext = gl.getExtension('EXT_disjoint_timer_query_webgl2'); const timeElapsedQuery = gl.createQuery(); // ã¯ãšãªãéå§ gl.beginQuery(gl.TIME_ELAPSED, timeElapsedQuery); // ããã«ã¬ã³ããªã³ã°ã³ãŒããèšè¿° renderScene(gl); // ã¯ãšãªãçµäº gl.endQuery(gl.TIME_ELAPSED); // çµæãéåæã§ååŸ setTimeout(() => { // ãã¬ãŒã ã®å®äºãåŸ ã€ const available = gl.getQueryParameter(timeElapsedQuery, gl.QUERY_RESULT_AVAILABLE); if (available) { const elapsedTime = gl.getQueryParameter(timeElapsedQuery, gl.QUERY_RESULT); console.log('çµéæé:', elapsedTime / 1000000, 'ms'); // ããç§ãããªç§ã«å€æ } else { console.warn('ã¯ãšãªçµæã¯ãŸã å©çšã§ããŸããã'); } }, 0); ```WebGL 2.0ã«é¢ããéèŠãªèæ ®äºé ïŒ
- éåææ§ïŒ ã¯ãšãªçµæã®ååŸã¯éåææäœã§ããéåžžãã¯ãšãªãå®äºããããšã確èªããããã«ã次ã®ãã¬ãŒã ãŸãã¯åŸç¶ã®ã¬ã³ããªã³ã°ãã¹ãŸã§åŸ ã€å¿ èŠããããŸããããã«ã¯ãçµæã®ååŸãã¹ã±ãžã¥ãŒã«ããããã«`setTimeout`ãrequestAnimationFrameã䜿çšããããšããããããŸãã
- Disjoint timer queriesïŒ
EXT_disjoint_timer_query_webgl2æ¡åŒµæ©èœã¯ãæ£ç¢ºãªã¿ã€ããŒã¯ãšãªã«ãšã£ãŠäžå¯æ¬ ã§ããGPUã®ã¿ã€ããŒãCPUã®ã¿ã€ããŒããåé¢ãããå¯èœæ§ããããäžæ£ç¢ºãªæž¬å®ã«ã€ãªãããšããæœåšçãªåé¡ã«å¯ŸåŠããŸãã - å©çšå¯èœãªã¯ãšãªïŒ
gl.TIME_ELAPSEDã¯äžè¬çãªã¯ãšãªã§ãããããŒããŠã§ã¢ããã©ã€ãã«ãã£ãŠã¯ä»ã®ã¯ãšãªãå©çšå¯èœãªå ŽåããããŸããå æ¬çãªãªã¹ãã«ã€ããŠã¯ãWebGL 2.0ã®ä»æ§æžããã³GPUã®ããã¥ã¡ã³ããåç §ããŠãã ããã
WebGL 1.0ïŒæ¡åŒµæ©èœã®æŽ»çš
WebGL 1.0ã«ã¯ãã€ãã©ã€ã³çµ±èšåéã®ããã®çµã¿èŸŒã¿ã¡ã«ããºã ããããŸããããããã€ãã®æ¡åŒµæ©èœãåæ§ã®æ©èœãæäŸããŸããæãäžè¬çã«äœ¿çšãããæ¡åŒµæ©èœã¯æ¬¡ã®ãšããã§ãïŒ
EXT_disjoint_timer_queryïŒ ãã®æ¡åŒµæ©èœã¯ãWebGL 2.0çãšåæ§ã«ãã¬ã³ããªã³ã°æäœäžã®çµéæéãæž¬å®ããããšãã§ããŸããããã¯ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã®è²ŽéãªããŒã«ã§ãã- ãã³ããŒåºæã®æ¡åŒµæ©èœïŒ äžéšã®GPUãã³ããŒã¯ããã詳现ãªããã©ãŒãã³ã¹ã«ãŠã³ã¿ãŒãæäŸããç¬èªã®æ¡åŒµæ©èœãæäŸããŠããŸãããããã®æ¡åŒµæ©èœã¯éåžžããã³ããŒã®ããŒããŠã§ã¢ã«åºæã§ããããã¹ãŠã®ããã€ã¹ã§å©çšã§ããããã§ã¯ãããŸãããäŸãšããŠã¯ãNVIDIAã®`NV_timer_query`ãAMDã®`AMD_performance_monitor`ããããŸãã
WebGL 1.0ã§ã®EXT_disjoint_timer_queryã®äœ¿çšæ³ïŒ
WebGL 1.0ã§EXT_disjoint_timer_queryã䜿çšããããã»ã¹ã¯ãWebGL 2.0ãšäŒŒãŠããŸãïŒ
- æ¡åŒµæ©èœã®ç¢ºèªïŒ ãŠãŒã¶ãŒã®ãã©ãŠã¶ã
EXT_disjoint_timer_queryæ¡åŒµæ©èœããµããŒãããŠããããšã確èªããŸãã - æ¡åŒµæ©èœã®æå¹åïŒ
gl.getExtension("EXT_disjoint_timer_query")ã䜿çšããŠæ¡åŒµæ©èœãžã®åç §ãååŸããŸãã - ã¿ã€ããŒã¯ãšãªã®äœæïŒ
ext.createQueryEXT()ã¡ãœããã䜿çšããŠã¯ãšãªãªããžã§ã¯ããäœæããŸãã - ã¯ãšãªã®éå§ãšçµäºïŒ ã¬ã³ããªã³ã°ã³ãŒãã
ext.beginQueryEXT()ãšext.endQueryEXT()åŒã³åºãã§å²ã¿ãŸããã¿ãŒã²ããã®ã¯ãšãªã¿ã€ãïŒext.TIME_ELAPSED_EXTïŒãæå®ããŸãã - ã¯ãšãªçµæã®ååŸïŒ
ext.getQueryObjectEXT()ã¡ãœããã䜿çšããŠã¯ãšãªãªããžã§ã¯ãããçµæãååŸããŸãã
äŸïŒæŠå¿µïŒïŒ
```javascript const canvas = document.getElementById('myCanvas'); const gl = canvas.getContext('webgl'); if (!gl) { console.error('WebGL 1.0ã¯ãµããŒããããŠããŸããïŒ'); return; } const ext = gl.getExtension('EXT_disjoint_timer_query'); if (!ext) { console.error('EXT_disjoint_timer_queryã¯ãµããŒããããŠããŸããïŒ'); return; } const timeElapsedQuery = ext.createQueryEXT(); // ã¯ãšãªãéå§ ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, timeElapsedQuery); // ããã«ã¬ã³ããªã³ã°ã³ãŒããèšè¿° renderScene(gl); // ã¯ãšãªãçµäº ext.endQueryEXT(ext.TIME_ELAPSED_EXT); // çµæãéåæã§ååŸ setTimeout(() => { const available = ext.getQueryObjectEXT(timeElapsedQuery, ext.QUERY_RESULT_AVAILABLE_EXT); if (available) { const elapsedTime = ext.getQueryObjectEXT(timeElapsedQuery, ext.QUERY_RESULT_EXT); console.log('çµéæé:', elapsedTime / 1000000, 'ms'); // ããç§ãããªç§ã«å€æ } else { console.warn('ã¯ãšãªçµæã¯ãŸã å©çšã§ããŸããã'); } }, 0); ```WebGL 1.0æ¡åŒµæ©èœã®èª²é¡ïŒ
- æ¡åŒµæ©èœã®å©çšå¯èœæ§ïŒ ãã¹ãŠã®ãã©ãŠã¶ãšããã€ã¹ã
EXT_disjoint_timer_queryæ¡åŒµæ©èœããµããŒãããŠããããã§ã¯ãªãããã䜿çšããåã«ãã®å©çšå¯èœæ§ã確èªããå¿ èŠããããŸãã - ãã³ããŒåºæã®ããªãšãŒã·ã§ã³ïŒ ãã³ããŒåºæã®æ¡åŒµæ©èœã¯ããã詳现ãªçµ±èšãæäŸããäžæ¹ã§ãç°ãªãGPUéã§ã®ç§»æ€æ§ããããŸããã
- 粟床ã®å¶éïŒ ã¿ã€ããŒã¯ãšãªã¯ãç¹ã«å€ãããŒããŠã§ã¢ã§ã¯ç²ŸåºŠã«å¶éãããå ŽåããããŸãã
代æ¿ãã¯ããã¯ïŒæåã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³
WebGL 2.0ãæ¡åŒµæ©èœã«é Œãããšãã§ããªãå Žåã¯ãæåã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã«é Œãããšãã§ããŸããããã¯ãç¹å®ã®æäœã®æç¶æéãæž¬å®ããããã«JavaScriptã³ãŒãã«ã¿ã€ãã³ã°ã³ãŒããæ¿å ¥ããããšãå«ã¿ãŸãã
äŸïŒ
```javascript const startTime = performance.now(); // ããã«ã¬ã³ããªã³ã°ã³ãŒããèšè¿° renderScene(gl); const endTime = performance.now(); const elapsedTime = endTime - startTime; console.log('çµéæé:', elapsedTime, 'ms'); ```æåã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã®å¶éïŒ
- äŸµå ¥çïŒ æåã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã¯ã³ãŒããä¹±éã«ããä¿å®ãããå°é£ã«ããå¯èœæ§ããããŸãã
- 粟床ãäœãïŒ æåã¿ã€ãã³ã°ã®ç²ŸåºŠã¯ãJavaScriptã®ãªãŒããŒãããããã®ä»ã®èŠå ã«ãã£ãŠåœ±é¿ãåããå¯èœæ§ããããŸãã
- ã¹ã³ãŒããéå®çïŒ æåã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã¯éåžžãå®éã®GPUå®è¡æéã§ã¯ãªããJavaScriptã³ãŒãã®æç¶æéã®ã¿ã枬å®ããŸãã
WebGLãã€ãã©ã€ã³çµ±èšã®è§£é
WebGLãã€ãã©ã€ã³çµ±èšãåéããããæ¬¡ã®ã¹ãããã¯ãã®æå³ãè§£éããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«äœ¿çšããããšã§ãã以äžã¯ãäžè¬çãªã¡ããªã¯ã¹ãšãã®æå³ã§ãïŒ
- çµéæéïŒ ãã¬ãŒã ãŸãã¯ç¹å®ã®ã¬ã³ããªã³ã°ãã¹ã®ã¬ã³ããªã³ã°ã«è²»ããããç·æéãçµéæéãé·ãå Žåã¯ããã€ãã©ã€ã³ã®ã©ããã«ããã©ãŒãã³ã¹ã®ããã«ããã¯ãããããšã瀺ããŸãã
- ãããŒã³ãŒã«ïŒ çºè¡ãããåå¥ã®ã¬ã³ããªã³ã°ã³ãã³ãã®æ°ããããŒã³ãŒã«ã®æ°ãå€ããšãåãããŒã³ãŒã«ãCPUãšGPUéã®éä¿¡ãå¿ èŠãšãããããCPUã®ãªãŒããŒãããã«ã€ãªããå¯èœæ§ããããŸãããããŒã³ãŒã«ã®æ°ãæžããããã«ãã€ã³ã¹ã¿ã³ã·ã³ã°ããããåŠçãªã©ã®ãã¯ããã¯ã®äœ¿çšãæ€èšããŠãã ããã
- é ç¹åŠçæéïŒ é ç¹ã·ã§ãŒããŒã§é ç¹ãåŠçããã®ã«è²»ããããæéãé ç¹åŠçæéãé·ãå Žåã¯ãé ç¹ã·ã§ãŒããŒãè€éãããããåŠçããé ç¹ãå€ãããããšã瀺ããŠããå¯èœæ§ããããŸãã
- ãã©ã°ã¡ã³ãåŠçæéïŒ ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§ãã©ã°ã¡ã³ããåŠçããã®ã«è²»ããããæéããã©ã°ã¡ã³ãåŠçæéãé·ãå Žåã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒãè€éãããããã¬ã³ããªã³ã°ãããã¯ã»ã«ãå€ãããïŒãªãŒããŒãããŒïŒããšã瀺ããŠããå¯èœæ§ããããŸãã
- ãã¯ã¹ãã£ãã§ããïŒ å®è¡ããããã¯ã¹ãã£ãã§ããã®æ°ããã¯ã¹ãã£ãã§ããã®æ°ãå€ãå Žåã¯ã䜿çšããŠãããã¯ã¹ãã£ãå€ããããããã¯ã¹ãã£ãã£ãã·ã¥ã广çã§ãªãããšã瀺ããŠããå¯èœæ§ããããŸãã
- ã¡ã¢ãªäœ¿çšéïŒ ãã¯ã¹ãã£ããããã¡ããã®ä»ã®ãªãœãŒã¹ã«å²ãåœãŠãããã¡ã¢ãªéãéå°ãªã¡ã¢ãªäœ¿çšã¯ãããã©ãŒãã³ã¹ã®åé¡ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ã«ã€ãªããå¯èœæ§ããããŸãã
ã·ããªãªäŸïŒé«ããã©ã°ã¡ã³ãåŠçæé
WebGLã¢ããªã±ãŒã·ã§ã³ã§é«ããã©ã°ã¡ã³ãåŠçæéã芳å¯ããããšããŸããããã¯ããã€ãã®èŠå ã«ããå¯èœæ§ããããŸãïŒ
- è€éãªãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒ ãã©ã°ã¡ã³ãã·ã§ãŒããŒããè€éãªã©ã€ãã£ã³ã°ãåŸåŠçãšãã§ã¯ããªã©ãé«äŸ¡ãªèšç®ãå®è¡ããŠããå¯èœæ§ããããŸãã
- ãªãŒããŒãããŒïŒ åããã¯ã»ã«ãè€æ°åã¬ã³ããªã³ã°ããŠãããäžèŠãªãã©ã°ã¡ã³ãã·ã§ãŒããŒã®åŒã³åºãã«ã€ãªãã£ãŠããå¯èœæ§ããããŸããããã¯ãéæãªãªããžã§ã¯ããã¬ã³ããªã³ã°ãããšããããªããžã§ã¯ããéãªããšãã«çºçããããšããããŸãã
- é«ããã¯ã»ã«å¯åºŠïŒ é«è§£å床ã®ç»é¢ã«ã¬ã³ããªã³ã°ããŠããå Žåããããããã«ããåŠçããå¿ èŠã®ãããã¯ã»ã«ã®æ°ãå¢å ããŸãã
ãã®åé¡ã«å¯ŸåŠããããã«ã以äžã詊ãããšãã§ããŸãïŒ
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®æé©åïŒ ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®ã³ãŒããç°¡çŽ åããèšç®ã®æ°ãæžããããã«ãã¯ã¢ããããŒãã«ã䜿çšããŠçµæãäºåã«èšç®ããŸãã
- ãªãŒããŒãããŒã®åæžïŒ 深床ãã¹ããæ©æZã«ãªã³ã°ãã¢ã«ãã¡ãã¬ã³ãã£ã³ã°ãªã©ã®ãã¯ããã¯ã䜿çšããŠãåãã¯ã»ã«ãã¬ã³ããªã³ã°ãããåæ°ãæžãããŸãã
- ã¬ã³ããªã³ã°è§£å床ã®åæžïŒ ããäœãè§£å床ã§ã¬ã³ããªã³ã°ãããã®åŸç»åãã¿ãŒã²ããè§£å床ã«ã¢ããã¹ã±ãŒã«ããŸãã
å®è·µäŸãšã±ãŒã¹ã¹ã¿ãã£
以äžã¯ãWebGLãã€ãã©ã€ã³çµ±èšãå®éã®ã¢ããªã±ãŒã·ã§ã³ãæé©åããããã«ã©ã®ããã«äœ¿çšã§ãããã®å®è·µäŸã§ãïŒ
- ã²ãŒã ïŒ WebGLã²ãŒã ã§ã¯ããã€ãã©ã€ã³çµ±èšã䜿çšããŠè€éãªã·ãŒã³ã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ã§ããŸããäŸãã°ããã©ã°ã¡ã³ãåŠçæéãé·ãå Žåãéçºè ã¯ã©ã€ãã£ã³ã°ã·ã§ãŒããŒãæé©åããããã·ãŒã³å ã®ã©ã€ãã®æ°ãæžããããããããšãã§ããŸãããŸããé ãã®ãªããžã§ã¯ãã®è€éãã軜æžããããã«ãã¬ãã«ãªããã£ããŒã«ïŒLODïŒãªã©ã®ãã¯ããã¯ã®äœ¿çšãæ€èšããããšããããŸãã
- ããŒã¿å¯èŠåïŒ WebGLããŒã¹ã®ããŒã¿å¯èŠåããŒã«ã§ã¯ããã€ãã©ã€ã³çµ±èšã䜿çšããŠå€§èŠæš¡ãªããŒã¿ã»ããã®ã¬ã³ããªã³ã°ãæé©åã§ããŸããäŸãã°ãé ç¹åŠçæéãé·ãå Žåãéçºè ã¯ãžãªã¡ããªãç°¡çŽ åããããã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããŠåäžã®ãããŒã³ãŒã«ã§è€æ°ã®ããŒã¿ãã€ã³ããã¬ã³ããªã³ã°ãããããããšãã§ããŸãã
- 補åã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒïŒ ã€ã³ã¿ã©ã¯ãã£ããª3D補åã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒã®å Žåããã¯ã¹ãã£ãã§ãããç£èŠããããšã§ãé«è§£å床ãã¯ã¹ãã£ã®èªã¿èŸŒã¿ãšã¬ã³ããªã³ã°ãæé©åããã®ã«åœ¹ç«ã¡ãŸãããã¯ã¹ãã£ãã§ããã®æ°ãå€ãå Žåãéçºè ã¯ããããããã³ã°ããã¯ã¹ãã£å§çž®ã䜿çšããŠãã¯ã¹ãã£ãµã€ãºãåæžã§ããŸãã
- 建ç¯ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ïŒ ã€ã³ã¿ã©ã¯ãã£ããªå»ºç¯ãŠã©ãŒã¯ã¹ã«ãŒãäœæããéã«ã¯ããããŒã³ãŒã«ãåæžããã·ã£ããŠã¬ã³ããªã³ã°ãæé©åããããšãã¹ã ãŒãºãªããã©ãŒãã³ã¹ã®éµãšãªããŸãããã€ãã©ã€ã³çµ±èšã¯ãã¬ã³ããªã³ã°æéã®æå€§ã®èŠå ãç¹å®ããæé©åã®åãçµã¿ãå°ãã®ã«åœ¹ç«ã¡ãŸããäŸãã°ããªã¯ã«ãŒãžã§ã³ã«ãªã³ã°ãªã©ã®ãã¯ããã¯ãå®è£ ããããšã§ãã«ã¡ã©ããã®å¯èŠæ§ã«åºã¥ããŠæç»ããããªããžã§ã¯ãã®æ°ãåçã«æžããããšãã§ããŸãã
ã±ãŒã¹ã¹ã¿ãã£ïŒè€éãª3Dã¢ãã«ãã¥ãŒã¢ã®æé©å
ããäŒç€Ÿããç£æ¥æ©åšã®è€éãª3Dã¢ãã«çšã®WebGLããŒã¹ã®ãã¥ãŒã¢ãéçºããŸããããã¥ãŒã¢ã®åæããŒãžã§ã³ã¯ãç¹ã«ããŒãšã³ãã®ããã€ã¹ã§ããã©ãŒãã³ã¹ãäœããšããåé¡ã«æ©ãŸãããŠããŸãããWebGLãã€ãã©ã€ã³çµ±èšãåéããããšã§ãéçºè ã¯ä»¥äžã®ããã«ããã¯ãç¹å®ããŸããïŒ
- 倿°ã®ãããŒã³ãŒã«ïŒ ã¢ãã«ã¯æ°åã®åå¥ã®ããŒãã§æ§æãããŠããããããããå¥ã ã®ãããŒã³ãŒã«ã§ã¬ã³ããªã³ã°ãããŠããŸããã
- è€éãªãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒ ã¢ãã«ã¯ãè€éãªã©ã€ãã£ã³ã°èšç®ã䌎ãç©çããŒã¹ã¬ã³ããªã³ã°ïŒPBRïŒã·ã§ãŒããŒã䜿çšããŠããŸããã
- é«è§£å床ãã¯ã¹ãã£ïŒ ã¢ãã«ã¯ã现ãããã£ããŒã«ãæããããã«é«è§£å床ã®ãã¯ã¹ãã£ã䜿çšããŠããŸããã
ãããã®ããã«ããã¯ã«å¯ŸåŠããããã«ãéçºè ã¯ä»¥äžã®æé©åã宿œããŸããïŒ
- ãããŒã³ãŒã«ãããã³ã°ïŒ ã¢ãã«ã®è€æ°ã®ããŒããåäžã®ãããŒã³ãŒã«ã«ãããåŠçããCPUã®ãªãŒããŒããããåæžããŸããã
- ã·ã§ãŒããŒã®æé©åïŒ PBRã·ã§ãŒããŒãç°¡çŽ åããèšç®ã®æ°ãæžãããå¯èœãªå Žåã¯ã«ãã¯ã¢ããããŒãã«ã䜿çšããŸããã
- ãã¯ã¹ãã£å§çž®ïŒ ãã¯ã¹ãã£å§çž®ã䜿çšããŠãã¯ã¹ãã£ãµã€ãºãåæžãããã¯ã¹ãã£ãã§ããã®ããã©ãŒãã³ã¹ãåäžãããŸããã
ãããã®æé©åã®çµæã3Dã¢ãã«ãã¥ãŒã¢ã®ããã©ãŒãã³ã¹ã¯ãç¹ã«ããŒãšã³ãã®ããã€ã¹ã§å€§å¹ ã«åäžããŸããããã¬ãŒã ã¬ãŒããåäžããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãé«ãŸããŸããã
WebGLããã©ãŒãã³ã¹æé©åã®ãã¹ããã©ã¯ãã£ã¹
ãã€ãã©ã€ã³çµ±èšã®åéãšåæã«å ããŠãWebGLããã©ãŒãã³ã¹æé©åã®ããã®äžè¬çãªãã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãïŒ
- ãããŒã³ãŒã«ãæå°éã«æããïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ããããåŠçããŸãã¯ãã®ä»ã®ãã¯ããã¯ã䜿çšããŠããããŒã³ãŒã«ã®æ°ãæžãããŸãã
- ã·ã§ãŒããŒãæé©åããïŒ ã·ã§ãŒããŒã³ãŒããç°¡çŽ åããèšç®ã®æ°ãæžãããå¯èœãªå Žåã¯ã«ãã¯ã¢ããããŒãã«ã䜿çšããŸãã
- ãã¯ã¹ãã£å§çž®ã䜿çšããïŒ ãã¯ã¹ãã£ãå§çž®ããŠãµã€ãºãå°ãããããã¯ã¹ãã£ãã§ããã®ããã©ãŒãã³ã¹ãåäžãããŸãã
- ããããããã³ã°ã䜿çšããïŒ ãã¯ã¹ãã£ã®ãããããããçæããŠãã¬ã³ããªã³ã°å質ãšããã©ãŒãã³ã¹ãåäžãããŸããç¹ã«é ãã®ãªããžã§ã¯ãã«å¯ŸããŠæå¹ã§ãã
- ãªãŒããŒãããŒãåæžããïŒ æ·±åºŠãã¹ããæ©æZã«ãªã³ã°ãã¢ã«ãã¡ãã¬ã³ãã£ã³ã°ãªã©ã®ãã¯ããã¯ã䜿çšããŠãåãã¯ã»ã«ãã¬ã³ããªã³ã°ãããåæ°ãæžãããŸãã
- ã¬ãã«ãªããã£ããŒã«ïŒLODïŒã䜿çšããïŒ ã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠããªããžã§ã¯ãã«ç°ãªã詳现ã¬ãã«ã䜿çšããŸãã
- é衚瀺ãªããžã§ã¯ããã«ãªã³ã°ããïŒ è¡šç€ºãããŠããªããªããžã§ã¯ããã¬ã³ããªã³ã°ãããªãããã«ããŸãã
- ã¡ã¢ãªäœ¿çšãæé©åããïŒ ã¡ã¢ãªãªãŒã¯ãé¿ããå¹ççãªãªãœãŒã¹å²ãåœãŠãä¿èšŒããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ã«ããïŒ ãã©ãŠã¶ã®éçºè ããŒã«ãå°éã®ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
- ç°ãªãããã€ã¹ã§ãã¹ãããïŒ æ§ã ãªããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããç°ãªãããŒããŠã§ã¢æ§æã§è¯å¥œã«åäœããããšã確èªããŸããç¹ã«ã¢ãã€ã«ãã©ãããã©ãŒã ãã¿ãŒã²ããã«ããå Žåã¯ãããŸããŸãªç»é¢è§£å床ãšãã¯ã»ã«å¯åºŠãèæ ®ããŠãã ããã
WebGLãããã¡ã€ãªã³ã°ãšãããã°ã®ããã®ããŒã«
WebGLã®ãããã¡ã€ãªã³ã°ãšãããã°ãæ¯æŽããããã€ãã®ããŒã«ããããŸãïŒ
- ãã©ãŠã¶éçºè ããŒã«ïŒ ã»ãšãã©ã®ææ°ãã©ãŠã¶ïŒChromeãFirefoxãSafariãEdgeïŒã«ã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°ãã·ã§ãŒããŒã³ãŒãã®æ€æ»ãGPUã¢ã¯ãã£ããã£ã®ç£èŠãå¯èœã«ãã匷åãªéçºè ããŒã«ãå«ãŸããŠããŸãããããã®ããŒã«ã¯ããããŒã³ãŒã«ããã¯ã¹ãã£äœ¿çšéãã¡ã¢ãªæ¶è²»ã«é¢ããè©³çŽ°ãªæ å ±ãæäŸããããšããããããŸãã
- WebGLã€ã³ã¹ãã¯ã¿ãŒïŒ Spector.jsãRenderDocãªã©ã®å°éçãªWebGLã€ã³ã¹ãã¯ã¿ãŒã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã«é¢ããããæ·±ãæŽå¯ãæäŸããŸãããããã®ããŒã«ã䜿çšãããšãåã ã®ãã¬ãŒã ããã£ããã£ãããããŒã³ãŒã«ãã¹ãããå®è¡ããWebGLãªããžã§ã¯ãã®ç¶æ ãæ€æ»ã§ããŸãã
- GPUãããã¡ã€ã©ãŒïŒ GPUãã³ããŒã¯ãGPUã®ããã©ãŒãã³ã¹ã«é¢ããè©³çŽ°ãªæ å ±ãæäŸãããããã¡ã€ãªã³ã°ããŒã«ãæäŸããŠããŸãããããã®ããŒã«ã¯ãã·ã§ãŒããŒã®ããã«ããã¯ãç¹å®ããç¹å®ã®ããŒããŠã§ã¢ã¢ãŒããã¯ãã£ã«åãããŠã³ãŒããæé©åããã®ã«åœ¹ç«ã¡ãŸããäŸãšããŠã¯ãNVIDIA NsightãAMD Radeon GPU ProfilerããããŸãã
- JavaScriptãããã¡ã€ã©ãŒïŒ äžè¬çãªJavaScriptãããã¡ã€ã©ãŒã¯ãJavaScriptã³ãŒãã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãããã鿥çã«WebGLã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
çµè«
WebGLãã€ãã©ã€ã³çµ±èšåéã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããã®äžå¯æ¬ ãªãã¯ããã¯ã§ãããããã®ã¡ããªã¯ã¹ã«ã¢ã¯ã»ã¹ãè§£éããæ¹æ³ãçè§£ããããšã§ãéçºè ã¯ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã·ã§ãŒããŒãæé©åãããããŒã³ãŒã«ãåæžããã¡ã¢ãªç®¡çãæ¹åããããšãã§ããŸããã²ãŒã ãããŒã¿å¯èŠåããŒã«ããŸãã¯ã€ã³ã¿ã©ã¯ãã£ããªè£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒãæ§ç¯ããŠããå Žåã§ããWebGLãã€ãã©ã€ã³çµ±èšããã¹ã¿ãŒããããšã§ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ã¹ã ãŒãºã§å¹ççããã€é åçãªWebããŒã¹ã®3DäœéšãäœæããåãåŸãããŸãã
WebGLã®ããã©ãŒãã³ã¹ã¯çµ¶ããé²åããåéã§ãããæé©ãªæé©åæŠç¥ã¯ã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ç¹æ§ãšã¿ãŒã²ããããŒããŠã§ã¢ã«äŸåããããšãå¿ããªãã§ãã ãããç¶ç¶çã«ãããã¡ã€ãªã³ã°ãå®éšãã¢ãããŒãã®é©å¿ãè¡ãããšããæé©ãªããã©ãŒãã³ã¹ãéæããããã®éµãšãªããŸãã