é ç¹åŠçããã¹ã¿ãŒããŠãåªããWebGLããã©ãŒãã³ã¹ãåŒãåºããŸãããããã®å æ¬çãªã¬ã€ãã§ã¯ãåºæ¬çãªããŒã¿ç®¡çããã€ã³ã¹ã¿ã³ã¹åããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãªã©ã®é«åºŠãªGPUæè¡ãŸã§ãã°ããŒãã«ãª3Däœéšãå®çŸããããã®æŠç¥ã詳述ããŸãã
WebGLãžãªã¡ããªãã€ãã©ã€ã³ã®æé©åïŒé ç¹åŠçã®åŒ·å
掻æ°ã«æºã¡ãçµ¶ããé²åããWebããŒã¹ã®3Dã°ã©ãã£ãã¯ã¹ã®äžçã§ã¯ãã¹ã ãŒãºã§é«æ§èœãªäœéšãæäŸããããšãæãéèŠã§ããeã³ããŒã¹ã®å·šäººã䜿çšããã€ã³ã¿ã©ã¯ãã£ããªè£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒããã倧éžããŸããç§åŠããŒã¿ã®å¯èŠåããããŠäžçäžã®äœçŸäžäººãã®äººã ãæ¥œããæ²¡å ¥åã²ãŒã äœéšãŸã§ãWebGLã¯åŒ·åãªå®çŸææ®µãšããŠååšããŸããããããçã®ãã¯ãŒã ãã§ã¯äžååã§ããããã®æœåšèœåãæå€§éã«åŒãåºãéµã¯æé©åã«ãããŸãããã®æé©åã®äžå¿ã«ããã®ããžãªã¡ããªãã€ãã©ã€ã³ã§ããããã®äžã§ãç¹ã«é ç¹åŠçã¯æ¥µããŠéèŠãªåœ¹å²ãæãããŸããéå¹çãªé ç¹åŠçã¯ããŠãŒã¶ãŒã®ããŒããŠã§ã¢ãå°ççãªå Žæã«é¢ä¿ãªããæå 端ã®ããžã¥ã¢ã«ã¢ããªã±ãŒã·ã§ã³ããåäœãé ãããã©ã¹ãã¬ãŒã·ã§ã³ã®ããŸãäœéšãžãšç¬æã«å€ããŠããŸãå¯èœæ§ããããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãé ç¹åŠçã®åŒ·åã«çŠç¹ãåœãŠãWebGLãžãªã¡ããªãã€ãã©ã€ã³ã®æé©åã®ãã¥ã¢ã³ã¹ãæ·±ãæãäžããŸããåºæ¬çãªæŠå¿µãæ¢æ±ããäžè¬çãªããã«ããã¯ãç¹å®ããåºæ¬çãªããŒã¿ç®¡çããé«åºŠãªGPUé§åã®åŒ·åãŸã§ãäžçäžã®ããã®éçºè ãé©ç°çãªããã©ãŒãã³ã¹ãšèŠèŠçã«çŸãã3Dã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«æŽ»çšã§ãããããŸããŸãªãã¯ããã¯ãæããã«ããŸãã
WebGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®çè§£ïŒã°ããŒãã«éçºè ã®ããã®ãããã
é ç¹åŠçã詳ããèŠãŠããåã«ãWebGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³å šäœãç°¡åã«ããããããŠããããšãäžå¯æ¬ ã§ãããã®åºç€çãªçè§£ã«ãããé ç¹åŠçãã©ãã«äœçœ®ãããã®å¹çãåŸç¶ã®ã¹ããŒãžã«ã©ãã»ã©å€§ããªåœ±é¿ãäžããããçè§£ããããšãã§ããŸãããã€ãã©ã€ã³ã¯ãããŒã¿ãæœè±¡çãªæ°åŠçèšè¿°ããç»é¢äžã®ã¬ã³ããªã³ã°ãããç»åãžã𿮵éçã«å€æãããäžé£ã®ã¹ãããã§æ§æãããŠããŸãã
CPUãšGPUã®åæ ïŒåºæ¬çãªããŒãããŒã·ãã
3Dã¢ãã«ãå®çŸ©ãã衚瀺ã«è³ããŸã§ã®éã®ãã¯ãäžå€®åŠçè£ çœ®ïŒCPUïŒãšã°ã©ãã£ãã¯ã¹åŠçè£ çœ®ïŒGPUïŒã®å ±åäœæ¥ã§ããCPUã¯éåžžãé«ã¬ãã«ã®ã·ãŒã³ç®¡çãã¢ã»ããã®èªã¿èŸŒã¿ãããŒã¿ã®æºåãGPUãžã®æç»ã³ãã³ãã®çºè¡ãæ åœããŸãã䞊ååŠçã«æé©åãããGPUã¯ãã¬ã³ããªã³ã°ãé ç¹å€æããã¯ã»ã«è²ã®èšç®ãšãã£ãè² è·ã®é«ãäœæ¥ãåŒãç¶ããŸãã
- CPUã®åœ¹å²ïŒã·ãŒã³ã®ã°ã©ã管çããªãœãŒã¹èªã¿èŸŒã¿ãç©çæŒç®ãã¢ãã¡ãŒã·ã§ã³ããžãã¯ãæç»ã³ãŒã«ïŒ`gl.drawArrays`ã`gl.drawElements`ïŒã®çºè¡ã
- GPUã®åœ¹å²ïŒé ç¹ãšãã©ã°ã¡ã³ãã®å€§èŠæš¡ãªäžŠååŠçãã©ã¹ã¿ã©ã€ãºããã¯ã¹ãã£ãµã³ããªã³ã°ããã¬ãŒã ãããã¡æäœã
é ç¹ä»æ§ïŒGPUãžã®ããŒã¿è»¢é
æåã®ã¹ãããã¯ã3Dãªããžã§ã¯ãã®ãžãªã¡ããªãå®çŸ©ããããšã§ãããã®ãžãªã¡ããªã¯é ç¹ã§æ§æãããåé ç¹ã¯3D空éå ã®ç¹ã衚ããäœçœ®ãæ³ç·ãã¯ãã«ïŒã©ã€ãã£ã³ã°çšïŒããã¯ã¹ãã£åº§æšïŒãã¯ã¹ãã£ãããã³ã°çšïŒããããŠå Žåã«ãã£ãŠã¯è²ããã®ä»ã®ã«ã¹ã¿ã ããŒã¿ãªã©ãããŸããŸãªå±æ§ãæã£ãŠããŸãããã®ããŒã¿ã¯éåžžãCPUäžã®JavaScript Typed Arrayã«æ ŒçŽããããã®åŸãããã¡ãªããžã§ã¯ãïŒé ç¹ãããã¡ãªããžã§ã¯ã - VBOïŒãšããŠGPUã«ã¢ããããŒããããŸãã
é ç¹ã·ã§ãŒããŒã¹ããŒãžïŒé ç¹åŠçã®å¿èéš
é ç¹ããŒã¿ãGPUäžã«é 眮ããããšãé ç¹ã·ã§ãŒããŒã«å ¥ããŸãããã®ããã°ã©ããã«ãªã¹ããŒãžã¯ãæç»ããããžãªã¡ããªã®äžéšã§ãããã¹ãŠã®é ç¹ã«å¯ŸããŠäžåºŠå®è¡ãããŸãããã®äž»ãªè²¬åã¯æ¬¡ã®ãšããã§ãïŒ
- 倿ïŒã¢ãã«ããã¥ãŒããããžã§ã¯ã·ã§ã³è¡åãé©çšããŠãé ç¹äœçœ®ãããŒã«ã«ãªããžã§ã¯ã空éããã¯ãªãã空éã«å€æããŸãã
- ã©ã€ãã£ã³ã°èšç®ïŒä»»æïŒïŒé ç¹ããšã®ã©ã€ãã£ã³ã°èšç®ãå®è¡ããŸããããã詳现ãªã©ã€ãã£ã³ã°ã¯ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§åŠçãããããšãå€ãã§ãã
- 屿§åŠçïŒé ç¹å±æ§ïŒãã¯ã¹ãã£åº§æšãæ³ç·ãªã©ïŒãä¿®æ£ãããããã€ãã©ã€ã³ã®æ¬¡ã®ã¹ããŒãžã«æž¡ãããããŸãã
- VaryingåºåïŒããªããã£ãïŒäžè§åœ¢ãç·ãç¹ïŒå šäœã§è£éããããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããããŒã¿ïŒãvaryingsããšããŠç¥ãããïŒãåºåããŸãã
é ç¹ã·ã§ãŒããŒã®å¹çã¯ãGPUããžãªã¡ããªããŒã¿ãã©ãã ãè¿ éã«åŠçã§ããããçŽæ¥æ±ºå®ããŸãããã®ã·ã§ãŒããŒå ã§ã®è€éãªèšç®ãéå°ãªããŒã¿ã¢ã¯ã»ã¹ã¯ãé倧ãªããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
ããªããã£ãã¢ã»ã³ããªãšã©ã¹ã¿ã©ã€ãºïŒåœ¢ç¶ã®åœ¢æ
ãã¹ãŠã®é ç¹ãé ç¹ã·ã§ãŒããŒã§åŠçãããåŸãæå®ãããæç»ã¢ãŒãïŒäŸïŒ`gl.TRIANGLES`ã`gl.LINES`ïŒã«åºã¥ããŠããªããã£ãïŒäŸïŒäžè§åœ¢ãç·ãç¹ïŒã«ã°ã«ãŒãåãããŸãããããã®ããªããã£ãã¯æ¬¡ã«ãã©ã¹ã¿ã©ã€ãºããããŸããããã¯ãGPUãåããªããã£ãã§èŠãããç»é¢ãã¯ã»ã«ã決å®ããããã»ã¹ã§ããã©ã¹ã¿ã©ã€ãºäžã«ãé ç¹ã·ã§ãŒããŒããã®ãvaryingãåºåãããªããã£ãã®è¡šé¢å šäœã§è£éãããåãã¯ã»ã«ãã©ã°ã¡ã³ãã®å€ãçæãããŸãã
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã¹ããŒãžïŒãã¯ã»ã«ã®çè²
åãã©ã°ã¡ã³ãïŒå€ãã®å Žåãã¯ã»ã«ã«å¯Ÿå¿ïŒã«å¯ŸããŠããã©ã°ã¡ã³ãã·ã§ãŒããŒãå®è¡ãããŸãããã®é«åºŠã«äžŠååãããã¹ããŒãžã¯ããã¯ã»ã«ã®æçµçãªè²ã決å®ããŸããéåžžãè£éãããvaryingããŒã¿ïŒäŸïŒè£éãããæ³ç·ããã¯ã¹ãã£åº§æšïŒã䜿çšãããã¯ã¹ãã£ããµã³ããªã³ã°ããã©ã€ãã£ã³ã°èšç®ãå®è¡ããŠããã¬ãŒã ãããã¡ã«æžã蟌ãŸããåºåè²ãçæããŸãã
ãã¯ã»ã«æäœïŒæçµçãªä»äžã
æçµã¹ããŒãžã§ã¯ã深床ãã¹ãïŒæåã®ãªããžã§ã¯ãã奥ã®ãªããžã§ã¯ãã®äžã«ã¬ã³ããªã³ã°ãããããã«ããïŒããã¬ã³ãã£ã³ã°ïŒéæåºŠã®ããïŒãã¹ãã³ã·ã«ãã¹ããªã©ã®ããŸããŸãªãã¯ã»ã«æäœãè¡ãããæçµçãªãã¯ã»ã«è²ãç»é¢ã®ãã¬ãŒã ãããã¡ã«æžã蟌ãŸããŸãã
é ç¹åŠçã®è©³çŽ°ïŒæŠå¿µãšèª²é¡
é ç¹åŠçã¹ããŒãžã¯ãçã®ãžãªã¡ããªããŒã¿ãèŠèŠè¡šçŸã«ãªãããã®æ ãå§ããå Žæã§ãããã®æ§æèŠçŽ ãšæœåšçãªèœãšã穎ãçè§£ããããšã¯ã广çãªæé©åã«ãšã£ãŠäžå¯æ¬ ã§ãã
é ç¹ãšã¯äœãïŒåãªãç¹ä»¥äž
åãªã3D座æšãšããŠèããããã¡ã§ãããWebGLã«ãããé ç¹ã¯ããã®ããããã£ãå®çŸ©ãã屿§ã®éåã§ãããããã®å±æ§ã¯åçŽãªäœçœ®ãè¶ ãããªã¢ã«ãªã¬ã³ããªã³ã°ã«äžå¯æ¬ ã§ãïŒ
- äœçœ®ïŒ3D空éå ã®`(x, y, z)`座æšãããã¯æãåºæ¬çãªå±æ§ã§ãã
- æ³ç·ïŒãã®é ç¹ã«ããããµãŒãã§ã¹ã«åçŽãªæ¹åã瀺ããã¯ãã«ãã©ã€ãã£ã³ã°èšç®ã«äžå¯æ¬ ã§ãã
- ãã¯ã¹ãã£åº§æšïŒUVïŒïŒ2Dãã¯ã¹ãã£ã3DãµãŒãã§ã¹ã«ãããã³ã°ãã`(u, v)`座æšã
- è²ïŒ`(r, g, b, a)`å€ãåçŽãªè²ã®ãªããžã§ã¯ãããã¯ã¹ãã£ã®è²ä»ãã«ãã䜿çšãããŸãã
- æ¥ç·ãšåŸæ³ç·ïŒBitangentïŒïŒæ³ç·ãããã³ã°ã®ãããªé«åºŠãªã©ã€ãã£ã³ã°æè¡ã«äœ¿çšãããŸãã
- ããŒã³ãŠã§ã€ã/ã€ã³ããã¯ã¹ïŒã¹ã±ã«ã¿ã«ã¢ãã¡ãŒã·ã§ã³çšã§ãåããŒã³ãé ç¹ã«ã©ãã ã圱é¿ãäžããããå®çŸ©ããŸãã
- ã«ã¹ã¿ã 屿§ïŒéçºè ã¯ãç¹å®ã®å¹æã«å¿ èŠãªè¿œå ããŒã¿ïŒäŸïŒããŒãã£ã¯ã«ã®é床ãã€ã³ã¹ã¿ã³ã¹IDïŒãå®çŸ©ã§ããŸãã
ãããã®å±æ§ã¯ããããããæå¹ã«ãªããšãGPUã«è»¢éãããé ç¹ã·ã§ãŒããŒã§åŠçãããå¿ èŠãããããŒã¿ãµã€ãºã«å¯äžããŸãã屿§ãå€ãã»ã©ãäžè¬çã«ããŒã¿éãå¢ããã·ã§ãŒããŒã®è€éããå¢ãå¯èœæ§ããããŸãã
é ç¹ã·ã§ãŒããŒã®ç®çïŒGPUã®å¹ŸäœåŠçåŠçã®äž»å
GLSLïŒOpenGL Shading LanguageïŒã§æžãããé ç¹ã·ã§ãŒããŒã¯ãGPUäžã§å®è¡ãããå°ããªããã°ã©ã ã§ãããã®äžæ žæ©èœã¯æ¬¡ã®ãšããã§ãïŒ
- ã¢ãã«-ãã¥ãŒ-ãããžã§ã¯ã·ã§ã³å€æïŒããã¯æãäžè¬çãªã¿ã¹ã¯ã§ããæåã¯ãªããžã§ã¯ãã®ããŒã«ã«ç©ºéã«ããé ç¹ããã¯ãŒã«ã空éïŒã¢ãã«è¡åçµç±ïŒã次ã«ã«ã¡ã©ç©ºéïŒãã¥ãŒè¡åçµç±ïŒããããŠæåŸã«ã¯ãªãã空éïŒãããžã§ã¯ã·ã§ã³è¡åçµç±ïŒã«å€æãããŸããã¯ãªãã空éã§ã®åºå`gl_Position`ã¯ãåŸç¶ã®ãã€ãã©ã€ã³ã¹ããŒãžã«ãšã£ãŠéèŠã§ãã
- 屿§ã®æŽŸçïŒãã©ã°ã¡ã³ãã·ã§ãŒããŒã§äœ¿çšããããã«ä»ã®é ç¹å±æ§ãèšç®ãŸãã¯å€æããŸããäŸãã°ãæ£ç¢ºãªã©ã€ãã£ã³ã°ã®ããã«æ³ç·ãã¯ãã«ãã¯ãŒã«ã空éã«å€æãããªã©ã§ãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒãžã®ããŒã¿æž¡ãïŒ`varying`倿°ã䜿çšããŠãé ç¹ã·ã§ãŒããŒã¯è£éãããããŒã¿ããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ããŸãããã®ããŒã¿ã¯éåžžãåãã¯ã»ã«ã«ããããµãŒãã§ã¹ã®ããããã£ã«é¢é£ããŠããŸãã
é ç¹åŠçã«ãããäžè¬çãªããã«ããã¯
ããã«ããã¯ãç¹å®ããããšã¯ã广çãªæé©åãžã®ç¬¬äžæ©ã§ããé ç¹åŠçã«ãããäžè¬çãªåé¡ã«ã¯ä»¥äžã®ãããªãã®ããããŸãïŒ
- éå°ãªé ç¹æ°ïŒäœçŸäžãã®é ç¹ãæã€ã¢ãã«ãæç»ããããšãç¹ã«ãã®å€ããç»é¢å€ã«ãã£ãããå°ããããŠç®ç«ããªãå Žåã¯ãGPUãå§åããå¯èœæ§ããããŸãã
- è€éãªé ç¹ã·ã§ãŒããŒïŒå€ãã®æ°åŠçæŒç®ãè€éãªæ¡ä»¶åå²ããŸãã¯åé·ãªèšç®ãæã€ã·ã§ãŒããŒã¯å®è¡ãé ããªããŸãã
- éå¹çãªããŒã¿è»¢éïŒCPUããGPUãžïŒïŒé ç¹ããŒã¿ã®é »ç¹ãªã¢ããããŒããéå¹çãªãããã¡ã¿ã€ãã®äœ¿çšããŸãã¯åé·ãªããŒã¿ã®éä¿¡ã¯ã垯åå¹ ãšCPUãµã€ã¯ã«ã浪費ããŸãã
- äžé©åãªããŒã¿ã¬ã€ã¢ãŠãïŒæé©åãããŠããªã屿§ã®ãããã³ã°ããGPUã®ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãšäžèŽããªãã€ã³ã¿ãŒãªãŒãããŒã¿ã¯ãããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ããããŸãã
- åé·ãªèšç®ïŒãã¬ãŒã ããšã«ããŸãã¯ã·ã§ãŒããŒå ã§äºåã«èšç®ã§ããã¯ãã®åãèšç®ãè€æ°åå®è¡ããããšã
é ç¹åŠçã®ããã®åºæ¬çãªæé©åæŠç¥
é ç¹åŠçã®æé©åã¯ãããŒã¿ã®å¹çãæ¹åããGPUãžã®è² è·ã軜æžããåºæ¬çãªãã¯ããã¯ããå§ãŸããŸãããããã®æŠç¥ã¯æ®éçã«é©çšå¯èœã§ããã髿§èœãªWebGLã¢ããªã±ãŒã·ã§ã³ã®åºç€ã圢æããŸãã
é ç¹æ°ãæžããïŒå°ãªãæ¹ãè¯ãããšãå€ã
æã圱é¿åã®ããæé©åã®1ã€ã¯ãåã«GPUãåŠçããªããã°ãªããªãé ç¹ã®æ°ãæžããããšã§ãããã¹ãŠã®é ç¹ã«ã¯ã³ã¹ãããããããããžãªã¡ããªã®è€éããè³¢ã管çããããšã¯å€§ããªå©çããããããŸãã
ã¬ãã«ã»ãªãã»ãã£ããŒã«ïŒLODïŒïŒã°ããŒãã«ãªã·ãŒã³ã®ããã®åçç°¡ç¥å
LODã¯ããªããžã§ã¯ããã«ã¡ã©ããã®è·é¢ã«å¿ããŠç°ãªãè€éãã®ã¡ãã·ã¥ã§è¡šçŸããæè¡ã§ããé ãã®ãªããžã§ã¯ãã¯ããåçŽãªã¡ãã·ã¥ïŒå°ãªãé ç¹ïŒã䜿çšããè¿ãã®ãªããžã§ã¯ãã¯ãã詳现ãªã¡ãã·ã¥ã䜿çšããŸããããã¯ãã·ãã¥ã¬ãŒã·ã§ã³ã建ç¯ãŠã©ãŒã¯ã¹ã«ãŒãªã©ãæ§ã ãªå°åã§äœ¿çšãããå€§èŠæš¡ãªç°å¢ã§ç¹ã«å¹æçã§ãå€ãã®ãªããžã§ã¯ããèŠãããããããŸããããã·ã£ãŒãã«çŠç¹ãåã£ãŠããã®ã¯å°æ°ã§ãã
- å®è£ ïŒã¢ãã«ã®è€æ°ã®ããŒãžã§ã³ïŒäŸïŒé«ãäžãäœããªãŽã³ïŒãä¿åããŸããã¢ããªã±ãŒã·ã§ã³ããžãã¯ã§ãè·é¢ãç»é¢ã¹ããŒã¹ã®ãµã€ãºããŸãã¯éèŠåºŠã«åºã¥ããŠé©åãªLODãæ±ºå®ããæç»åã«å¯Ÿå¿ããé ç¹ãããã¡ããã€ã³ãããŸãã
- å©ç¹ïŒèŠèŠçãªå質ãèããæãªãããšãªããé ãã®ãªããžã§ã¯ãã®é ç¹åŠçãå€§å¹ ã«åæžããŸãã
ã«ãªã³ã°æè¡ïŒèŠããªããã®ã¯æç»ããªã
äžéšã®ã«ãªã³ã°ïŒãã©ã¹ã¿ã ã«ãªã³ã°ãªã©ïŒã¯é ç¹ã·ã§ãŒããŒã®åã«è¡ãããŸãããä»ã®ã«ãªã³ã°ã¯äžèŠãªé ç¹åŠçãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- ãã©ã¹ã¿ã ã«ãªã³ã°ïŒããã¯éèŠãªCPUåŽã®æé©åã§ãããªããžã§ã¯ãã®ããŠã³ãã£ã³ã°ããã¯ã¹ãŸãã¯ã¹ãã£ã¢ãã«ã¡ã©ã®ãã¥ãŒãã©ã¹ã¿ã ãšäº€å·®ãããã©ããããã¹ãããŸãããªããžã§ã¯ããå®å šã«ãã©ã¹ã¿ã ã®å€ã«ããå Žåããã®é ç¹ã¯ã¬ã³ããªã³ã°ã®ããã«GPUã«éä¿¡ãããããšã¯ãããŸããã
- ãªã¯ã«ãŒãžã§ã³ã«ãªã³ã°ïŒããè€éãªãã®æè¡ã¯ããªããžã§ã¯ããå¥ã®ãªããžã§ã¯ãã®åŸãã«é ããŠãããã©ããã倿ããŸããå€ãã®å ŽåCPUé§åã§ãããããã€ãã®é«åºŠãªGPUããŒã¹ã®ãªã¯ã«ãŒãžã§ã³ã«ãªã³ã°ææ³ãååšããŸãã
- èé¢ã«ãªã³ã°ïŒããã¯æšæºçãªGPUæ©èœã§ãïŒ`gl.enable(gl.CULL_FACE)`ïŒãèé¢ãã«ã¡ã©ã«åããŠããäžè§åœ¢ïŒã€ãŸããæ³ç·ãã«ã¡ã©ããé¢ããæ¹åãåããŠããïŒã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒã®åã«ç Žæ£ãããŸããããã¯ãœãªãããªããžã§ã¯ãã«å¹æçã§ãéåžžãäžè§åœ¢ã®çŽååãã«ãªã³ã°ããŸããé ç¹ã·ã§ãŒããŒã®å®è¡åæ°ã¯æžãããŸãããããã©ã°ã¡ã³ãã·ã§ãŒããŒãšã©ã¹ã¿ã©ã€ãºã®äœæ¥ãå€§å¹ ã«ç¯çŽããŸãã
ã¡ãã·ã¥ã®éåŒã/ç°¡ç¥åïŒããŒã«ãšã¢ã«ãŽãªãºã
éçãªã¢ãã«ã®å ŽåãååŠçããŒã«ã䜿çšããããšã§ãèŠèŠçãªå¿ å®åºŠãä¿ã¡ãªããé ç¹æ°ãå€§å¹ ã«åæžã§ããŸããBlenderãAutodesk Mayaãªã©ã®ãœãããŠã§ã¢ããå°çšã®ã¡ãã·ã¥æé©åããŒã«ã¯ãé ç¹ãäžè§åœ¢ãè³¢ãåé€ããããã®ã¢ã«ãŽãªãºã ïŒäŸïŒäºæ¬¡èª€å·®è©äŸ¡æ³ã«ããç°¡ç¥åïŒãæäŸããŸãã
å¹ççãªããŒã¿è»¢éãšç®¡çïŒããŒã¿ãããŒã®æé©å
é ç¹ããŒã¿ãã©ã®ããã«æ§é åããGPUã«è»¢éãããã¯ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸããCPUãšGPUéã®åž¯åå¹ ã¯æéãªã®ã§ãå¹ççãªäœ¿çšãäžå¯æ¬ ã§ãã
ãããã¡ãªããžã§ã¯ãïŒVBOãIBOïŒïŒGPUããŒã¿ã¹ãã¬ãŒãžã®ç€
é ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒã¯ãé ç¹å±æ§ããŒã¿ïŒäœçœ®ãæ³ç·ãUVïŒãGPUã«æ ŒçŽããŸããã€ã³ããã¯ã¹ãããã¡ãªããžã§ã¯ãïŒIBOããŸãã¯èŠçŽ ãããã¡ãªããžã§ã¯ãïŒã¯ãé ç¹ãã©ã®ããã«æ¥ç¶ãããŠããªããã£ãã圢æããããå®çŸ©ããã€ã³ããã¯ã¹ãæ ŒçŽããŸãããããã䜿çšããããšã¯ãWebGLã®ããã©ãŒãã³ã¹ã®åºæ¬ã§ãã
- VBOïŒäžåºŠäœæãããã€ã³ãããããŒã¿ãã¢ããããŒãïŒ`gl.bufferData`ïŒããæç»ãå¿ èŠãªãšãã«åã«ãã€ã³ãããŸããããã«ããããã¬ãŒã ããšã«é ç¹ããŒã¿ãGPUã«åã¢ããããŒãããããšãé¿ããŸãã
- IBOïŒã€ã³ããã¯ã¹ä»ãæç»ïŒ`gl.drawElements`ïŒã䜿çšããããšã§ãé ç¹ãåå©çšã§ããŸããè€æ°ã®äžè§åœ¢ãé ç¹ãå ±æããå ŽåïŒäŸïŒãšããžã§ïŒããã®é ç¹ã®ããŒã¿ã¯VBOã«äžåºŠã ãæ ŒçŽããã°ãããIBOããããè€æ°ååç §ããŸããããã«ãããè€éãªã¡ãã·ã¥ã®ã¡ã¢ãªãããããªã³ããšè»¢éæéãåçã«åæžãããŸãã
åçããŒã¿ vs. éçããŒã¿ïŒæ£ãã䜿çšãã³ãã®éžæ
ãããã¡ãªããžã§ã¯ããäœæããéã䜿çšãã³ãïŒ`gl.STATIC_DRAW`ã`gl.DYNAMIC_DRAW`ã`gl.STREAM_DRAW`ïŒãæäŸããŸãããã®ãã³ãã¯ããã©ã€ããŒã«ããŒã¿ã®äœ¿çšæå³ãäŒããã¹ãã¬ãŒãžãæé©åã§ããããã«ããŸãã
- `gl.STATIC_DRAW`ïŒäžåºŠã¢ããããŒããããäœåºŠã䜿çšãããããŒã¿çšïŒäŸïŒéçã¢ãã«ïŒãGPUãæé©ãªã¡ã¢ãªã«é 眮ã§ãããããæãäžè¬çã§ãå€ãã®å Žåæãããã©ãŒãã³ã¹ãé«ããªãã·ã§ã³ã§ãã
- `gl.DYNAMIC_DRAW`ïŒé »ç¹ã«æŽæ°ãããããããã§ãäœåºŠã䜿çšãããããŒã¿çšïŒäŸïŒãã¬ãŒã ããšã«æŽæ°ãããã¢ãã¡ãŒã·ã§ã³ãã£ã©ã¯ã¿ãŒã®é ç¹ïŒã
- `gl.STREAM_DRAW`ïŒäžåºŠã¢ããããŒããããæ°åãã䜿çšãããªãããŒã¿çšïŒäŸïŒäžæçãªããŒãã£ã¯ã«ïŒã
ãããã®ãã³ãã誀çšãããšïŒäŸïŒ`STATIC_DRAW`ãããã¡ããã¬ãŒã ããšã«æŽæ°ããïŒããã©ã€ããŒãããŒã¿ãç§»åããããã¡ã¢ãªãåå²ãåœãŠãããããå¿ èŠããããããããã©ãŒãã³ã¹ã®ããã«ãã£ã«ã€ãªããå¯èœæ§ããããŸãã
ããŒã¿ã®ã€ã³ã¿ãŒãªãŒã vs. åå¥å±æ§ïŒã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³
é ç¹å±æ§ã1ã€ã®å€§ããªãããã¡ïŒã€ã³ã¿ãŒãªãŒãïŒã«æ ŒçŽããããšãã屿§ããšã«åå¥ã®ãããã¡ã«æ ŒçŽããããšãã§ããŸããã©ã¡ãã«ããã¬ãŒããªãããããŸãã
- ã€ã³ã¿ãŒãªãŒãããŒã¿ïŒåäžã®é ç¹ã®ãã¹ãŠã®å±æ§ãã¡ã¢ãªå ã§é£ç¶ããŠæ ŒçŽãããŸãïŒäŸïŒ`P1N1U1 P2N2U2 P3N3U3...`ïŒã
- åå¥å±æ§ïŒå屿§ã¿ã€ããç¬èªã®ãããã¡ãæã¡ãŸãïŒäŸïŒ`P1P2P3... N1N2N3... U1U2U3...`ïŒã
äžè¬çã«ãçŸä»£ã®GPUã§ã¯ã€ã³ã¿ãŒãªãŒãããŒã¿ã奜ãŸããããšãå€ãã§ãããªããªããåäžã®é ç¹ã®å±æ§ã¯äžç·ã«ã¢ã¯ã»ã¹ãããå¯èœæ§ãé«ãããã§ããããã«ãããã£ãã·ã¥ã®ã³ããŒã¬ã³ã·ãåäžããGPUã¯ããå°ãªãã¡ã¢ãªã¢ã¯ã»ã¹æäœã§é ç¹ã«å¿ èŠãªãã¹ãŠã®ããŒã¿ããã§ããã§ããŸãããã ããç¹å®ã®ãã¹ã§å±æ§ã®ãµãã»ããã®ã¿ãå¿ èŠãªå Žåã¯ãåå¥ã®ãããã¡ãæè»æ§ãæäŸãããããããŸããããæ£åšããã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ã®ãããå€ãã®å Žåã³ã¹ããé«ããªããŸãã
ããŒã¿ã®ãããã³ã°ïŒå±æ§ãããã®ãã€ãæ°ãæžãã
é ç¹å±æ§ã®ãµã€ãºãæå°éã«æããŸããäŸãã°ïŒ
- æ³ç·ïŒ`vec3`ïŒ3ã€ã®32ãããæµ®åå°æ°ç¹æ°ïŒã®ä»£ããã«ãæ£èŠåããããã¯ãã«ã¯`BYTE`ãŸãã¯`SHORT`æŽæ°ãšããŠæ ŒçŽããã·ã§ãŒããŒã§æ£èŠåããããšãå€ãã§ãã`gl.vertexAttribPointer`ã§ã¯`gl.BYTE`ãŸãã¯`gl.SHORT`ãæå®ãã`normalized`ã«`true`ãæž¡ãããšã§ã[-1, 1]ã®ç¯å²ã®æµ®åå°æ°ç¹æ°ã«å€æã§ããŸãã
- è²ïŒå€ãã®å Žå`vec4`ïŒRGBAçšã®4ã€ã®32ãããæµ®åå°æ°ç¹æ°ïŒã§ãããåäžã®`UNSIGNED_BYTE`ãŸãã¯`UNSIGNED_INT`ã«ããã¯ããŠã¹ããŒã¹ãç¯çŽã§ããŸãã
- ãã¯ã¹ãã£åº§æšïŒåžžã«ç¹å®ã®ç¯å²å ïŒäŸïŒ[0, 1]ïŒã«ããå Žåãç¹ã«ç²ŸåºŠãéèŠã§ãªãå Žåã¯`UNSIGNED_BYTE`ãŸãã¯`SHORT`ã§ååãªå ŽåããããŸãã
é ç¹ããšã«ç¯çŽããããã¹ãŠã®ãã€ãã¯ãã¡ã¢ãªãããããªã³ãã転éæéãã¡ã¢ãªåž¯åå¹ ãåæžããããã¯å€ãã®ã°ããŒãã«åžå Žã§äžè¬çãªã¢ãã€ã«ããã€ã¹ãçµ±åGPUã«ãšã£ãŠéèŠã§ãã
é ç¹ã·ã§ãŒããŒæäœã®å¹çåïŒGPUãè³¢ãåããã
é ç¹ã·ã§ãŒããŒã¯ãè€éãªã·ãŒã³ã§ã¯ãã¬ãŒã ããšã«äœçŸäžåãå®è¡ãããŸãããã®ã³ãŒããæé©åããããšã¯æåªå äºé ã§ãã
æ°åŠçç°¡ç¥åïŒé«ã³ã¹ããªæäœãé¿ãã
äžéšã®GLSLæäœã¯ãä»ã®ãã®ãããèšç®ã³ã¹ããé«ããªããŸãïŒ
- å¯èœãªéã`pow`ã`sqrt`ã`sin`ã`cos`ãé¿ããïŒç·åœ¢è¿äŒŒã§ååãªå Žåã¯ãããã䜿çšããŸããäŸãã°ãäºä¹ã®å Žåã`pow(x, 2.0)`ããã`x * x`ã®æ¹ãéãã§ãã
- æ£èŠåã¯äžåºŠã ãïŒãã¯ãã«ãæ£èŠåããå¿ èŠãããå Žåã¯ãäžåºŠã ãè¡ããŸãã宿°ã§ããã°ãCPUã§æ£èŠåããŸãã
- è¡åã®ä¹ç®ïŒå¿ èŠãªè¡åä¹ç®ã®ã¿ãå®è¡ããŠããããšã確èªããŸããäŸãã°ãæ³ç·è¡åã`inverse(transpose(modelViewMatrix))`ã§ããå Žåãã·ã§ãŒããŒå ã®ãã¹ãŠã®é ç¹ã§`inverse(transpose(u_modelViewMatrix))`ãèšç®ããã®ã§ã¯ãªããCPUã§äžåºŠèšç®ãããŠããã©ãŒã ãšããŠæž¡ããŸãã
- 宿°ïŒã³ã³ãã€ã©ãæé©åã§ããããã«ã宿°ïŒ`const`ïŒã宣èšããŸãã
æ¡ä»¶ä»ãããžãã¯ïŒåå²ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿
ã·ã§ãŒããŒå ã®`if/else`æã¯ãç¹ã«åå²ã®ãã€ããŒãžã§ã³ã¹ãé«ãïŒã€ãŸããç°ãªãé ç¹ãç°ãªããã¹ãéãïŒå Žåã«é«ã³ã¹ãã«ãªãå¯èœæ§ããããŸããGPUã¯ããã¹ãŠã®ã·ã§ãŒããŒã³ã¢ãåãåœä»€ãå®è¡ããããŠããã©ãŒã ããªå®è¡ã奜ã¿ãŸããåå²ãé¿ããããªãå Žåã¯ãè¿ãã®é ç¹ãåããã¹ãéãããã«ãã§ããã ããã³ããŒã¬ã³ããã«ããããã«ããŠãã ããã
æã«ã¯ãäž¡æ¹ã®çµæãèšç®ãããã®åŸ`mix`ã`step`ã§ãããã®éãåãæ¿ããæ¹ãè¯ãå ŽåããããŸããããã«ãããäžéšã®çµæãç Žæ£ãããŠããGPUãåœä»€ã䞊åã«å®è¡ã§ããŸãããã ããããã¯ãããã¡ã€ãªã³ã°ãå¿ èŠãªã±ãŒã¹ãã€ã±ãŒã¹ã®æé©åã§ãã
CPUã§ã®äºåèšç®ïŒå¯èœãªéãäœæ¥ãç§»è¡ãã
èšç®ãCPUã§äžåºŠå®è¡ã§ãããã®çµæããŠããã©ãŒã ãšããŠGPUã«æž¡ããå Žåãã·ã§ãŒããŒå ã®ãã¹ãŠã®é ç¹ã§èšç®ãããããã»ãŒåžžã«å¹ççã§ããäŸãšããŠã¯ïŒ
- æ¥ç·ãã¯ãã«ãšåŸæ³ç·ãã¯ãã«ã®çæã
- ãªããžã§ã¯ãã®ãã¹ãŠã®é ç¹ã§äžå®ã®å€æã®èšç®ã
- éçãªå Žåã®ã¢ãã¡ãŒã·ã§ã³ãã¬ã³ããŠã§ã€ãã®äºåèšç®ã
`varying`ã®å¹æçãªäœ¿çšïŒå¿ èŠãªããŒã¿ã®ã¿ãæž¡ã
é ç¹ã·ã§ãŒããŒãããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããå`varying`倿°ã¯ãã¡ã¢ãªãšåž¯åå¹ ãæ¶è²»ããŸãããã©ã°ã¡ã³ãã·ã§ãŒãã£ã³ã°ã«çµ¶å¯Ÿã«å¿ èŠãªããŒã¿ã®ã¿ãæž¡ããŠãã ãããäŸãã°ãç¹å®ã®ãããªã¢ã«ã§ãã¯ã¹ãã£åº§æšã䜿çšããŠããªãå Žåã¯ãããããæž¡ããªãã§ãã ããã
屿§ã®ãšã€ãªã¢ã·ã³ã°ïŒå±æ§æ°ãæžãã
å Žåã«ãã£ãŠã¯ã2ã€ã®ç°ãªã屿§ãåãããŒã¿åãå ±æããæ å ±ã®æå€±ãªãè«ççã«çµã¿åãããããšãã§ããå ŽåïŒäŸïŒ1ã€ã®`vec4`ã䜿çšããŠ2ã€ã®`vec2`屿§ãæ ŒçŽããïŒãã¢ã¯ãã£ããªå±æ§ã®ç·æ°ãæžããããšãã§ããã·ã§ãŒããŒåœä»€ã®ãªãŒããŒããããåæžããããšã§ããã©ãŒãã³ã¹ãåäžãããå¯èœæ§ããããŸãã
WebGLã«ãããé«åºŠãªé ç¹åŠçã®åŒ·å
WebGL 2.0ïŒããã³WebGL 1.0ã®äžéšã®æ¡åŒµæ©èœïŒã«ãããéçºè ã¯ãã匷åãªæ©èœã«ã¢ã¯ã»ã¹ã§ããããã«ãªããæŽç·ŽãããGPUé§åã®é ç¹åŠçãå¯èœã«ãªããŸããããããã®æè¡ã¯ãã°ããŒãã«ãªç¯å²ã®ããã€ã¹ããã©ãããã©ãŒã ã§ãéåžžã«è©³çްã§åçãªã·ãŒã³ãå¹ççã«ã¬ã³ããªã³ã°ããããã«äžå¯æ¬ ã§ãã
ã€ã³ã¹ã¿ã³ã¹åïŒWebGL 2.0 / `ANGLE_instanced_arrays`ïŒ
ã€ã³ã¹ã¿ã³ã¹åã¯ãåäžã®æç»ã³ãŒã«ã§åããžãªã¡ããªãªããžã§ã¯ãã®è€æ°ã®ã³ããŒãã¬ã³ããªã³ã°ããããã®é©æ°çãªæè¡ã§ããæ£®ã®åæšã矀è¡ã®åãã£ã©ã¯ã¿ãŒã«å¯ŸããŠ`gl.drawElements`ã³ãŒã«ãçºè¡ãã代ããã«ãã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ãæž¡ããŠãäžåºŠã«ãã¹ãŠãæç»ã§ããŸãã
æŠå¿µïŒ1ã€ã®æç»ã³ãŒã«ã§å€ãã®ãªããžã§ã¯ã
åŸæ¥ã1,000æ¬ã®æšãã¬ã³ããªã³ã°ããã«ã¯ããããããç¬èªã®ç¶æ 倿ŽïŒãããã¡ã®ãã€ã³ãããŠããã©ãŒã ã®èšå®ïŒã䌎ã1,000åã®åå¥ã®æç»ã³ãŒã«ãå¿ èŠã§ãããããã¯ããžãªã¡ããªèªäœãåçŽã§ãã£ãŠãã倧ããªCPUãªãŒããŒããããçºçãããŸããã€ã³ã¹ã¿ã³ã¹åã䜿çšãããšãããŒã¹ãžãªã¡ããªïŒäŸïŒ1æ¬ã®æšã®ã¢ãã«ïŒãäžåºŠå®çŸ©ãããã®åŸã€ã³ã¹ã¿ã³ã¹åºæã®å±æ§ïŒäŸïŒäœçœ®ãã¹ã±ãŒã«ãå転ãè²ïŒã®ãªã¹ããGPUã«æäŸã§ããŸããé ç¹ã·ã§ãŒããŒã¯ã远å ã®å ¥å`gl_InstanceID`ïŒãŸãã¯æ¡åŒµæ©èœçµç±ã®åçã®ãã®ïŒã䜿çšããŠãæ£ããã€ã³ã¹ã¿ã³ã¹ããŒã¿ããã§ããããŸãã
ã°ããŒãã«ãªåœ±é¿ãæã€ãŠãŒã¹ã±ãŒã¹
- ããŒãã£ã¯ã«ã·ã¹ãã ïŒäœçŸäžãã®ããŒãã£ã¯ã«ããããããåçŽãªã¯ã¯ããã®ã€ã³ã¹ã¿ã³ã¹ã
- æ€çïŒèå°ãæ£®ã®æšã ããã¹ãŠãæå°éã®æç»ã³ãŒã«ã§ã¬ã³ããªã³ã°ãããŸãã
- 矀è¡/矀ãã®ã·ãã¥ã¬ãŒã·ã§ã³ïŒã·ãã¥ã¬ãŒã·ã§ã³å ã®å€ãã®åäžãŸãã¯ãããã«ç°ãªããšã³ãã£ãã£ã
- å埩çãªå»ºç¯èŠçŽ ïŒå€§ããªå»ºç©ã®ã¢ãã«ã«ãããã¬ã³ã¬ãçªãæããã
ã€ã³ã¹ã¿ã³ã¹åã¯CPUãªãŒããŒããããåçã«åæžãããªããžã§ã¯ãæ°ãéåžžã«å€ããã¯ããã«è€éãªã·ãŒã³ãå¯èœã«ããŸããããã¯ãå é²å°åã®åŒ·åãªãã¹ã¯ããããããäžççã«æ®åããŠããããæ§ãããªã¢ãã€ã«ããã€ã¹ãŸã§ãå¹ åºãããŒããŠã§ã¢æ§æã§ã®ã€ã³ã¿ã©ã¯ãã£ããªäœéšã«ãšã£ãŠäžå¯æ¬ ã§ãã
å®è£ ã®è©³çްïŒã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§
ã€ã³ã¹ã¿ã³ã¹åãå®è£ ããã«ã¯ã以äžã䜿çšããŸãïŒ
- `gl.vertexAttribDivisor(index, divisor)`ïŒãã®é¢æ°ãéµã§ãã`divisor`ã0ïŒããã©ã«ãïŒã®å Žåã屿§ã¯é ç¹ããšã«1åé²ã¿ãŸãã`divisor`ã1ã®å Žåã屿§ã¯ã€ã³ã¹ã¿ã³ã¹ããšã«1åé²ã¿ãŸãã
- `gl.drawArraysInstanced` ãŸã㯠`gl.drawElementsInstanced`ïŒãããã®æ°ããæç»ã³ãŒã«ã¯ãã¬ã³ããªã³ã°ããã€ã³ã¹ã¿ã³ã¹ã®æ°ãæå®ããŸãã
é ç¹ã·ã§ãŒããŒã¯ãã°ããŒãã«å±æ§ïŒäœçœ®ãªã©ïŒãšãã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ïŒ`a_instanceMatrix`ãªã©ïŒãèªã¿åãã`gl_InstanceID`ã䜿çšããŠåã€ã³ã¹ã¿ã³ã¹ã®æ£ãã倿ãã«ãã¯ã¢ããããŸãã
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ïŒWebGL 2.0ïŒ
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãé ç¹ã·ã§ãŒããŒã®åºåããããã¡ãªããžã§ã¯ãã«ãã£ããã£ã§ãã匷åãªWebGL 2.0ã®æ©èœã§ããããã¯ãGPUãé ç¹ãåŠçããã ãã§ãªãããããã®åŠçã¹ãããã®çµæãæ°ãããããã¡ã«æžã蟌ãããšãã§ãããã®ãããã¡ã¯åŸç¶ã®ã¬ã³ããªã³ã°ãã¹ãä»ã®ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯æäœã®å ¥åãšããŠäœ¿çšã§ããããšãæå³ããŸãã
æŠå¿µïŒGPUé§åã®ããŒã¿çæãšå€æŽ
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ä»¥åã¯ãGPUã§ããŒãã£ã¯ã«ãã·ãã¥ã¬ãŒãããŠããã¬ã³ããªã³ã°ãããå Žåãæ°ããäœçœ®ã`varying`ãšããŠåºåããããããäœããã®æ¹æ³ã§CPUãããã¡ã«æ»ããæ¬¡ã®ãã¬ãŒã ã®ããã«GPUãããã¡ã«åã¢ããããŒãããå¿ èŠããããŸããããã®ãåŸåŸ©ãã¯éåžžã«éå¹çã§ããããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãçŽæ¥çãªGPUããGPUãžã®ã¯ãŒã¯ãããŒãå¯èœã«ããŸãã
åçãžãªã¡ããªãšã·ãã¥ã¬ãŒã·ã§ã³ã®é©åœ
- GPUããŒã¹ã®ããŒãã£ã¯ã«ã·ã¹ãã ïŒããŒãã£ã¯ã«ã®ç§»åãè¡çªãçæãå®å šã«GPUäžã§ã·ãã¥ã¬ãŒãããŸãã1ã€ã®é ç¹ã·ã§ãŒããŒãå€ãäœçœ®/é床ã«åºã¥ããŠæ°ããäœçœ®/é床ãèšç®ãããããããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãä»ããŠãã£ããã£ãããŸããæ¬¡ã®ãã¬ãŒã ã§ã¯ããããã®æ°ããäœçœ®ãã¬ã³ããªã³ã°ã®å ¥åã«ãªããŸãã
- ããã·ãŒãžã£ã«ãžãªã¡ããªçæïŒåçãªã¡ãã·ã¥ãäœæããããæ¢åã®ã¡ãã·ã¥ãçŽç²ã«GPUäžã§å€æŽãããããŸãã
- GPUã§ã®ç©çæŒç®ïŒå€æ°ã®ãªããžã§ã¯ãã®åçŽãªç©ççžäºäœçšãã·ãã¥ã¬ãŒãããŸãã
- ã¹ã±ã«ã¿ã«ã¢ãã¡ãŒã·ã§ã³ïŒGPUã§ã®ã¹ããã³ã°ã®ããã®ããŒã³å€æãäºåã«èšç®ããŸãã
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãè€éã§åçãªããŒã¿æäœãCPUããGPUã«ç§»è¡ãããã¡ã€ã³ã¹ã¬ããã®è² è·ãå€§å¹ ã«è»œæžããç¹ã«äžçäžã®ããŸããŸãªã³ã³ãã¥ãŒãã£ã³ã°ã¢ãŒããã¯ãã£ã§äžè²«ããŠåäœããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãã¯ããã«æŽç·Žãããã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã·ã§ã³ãšãšãã§ã¯ããå¯èœã«ããŸãã
å®è£ ã®è©³çް
äž»ãªæé ã¯æ¬¡ã®ãšããã§ãïŒ
- `TransformFeedback`ãªããžã§ã¯ããäœæããïŒ`gl.createTransformFeedback`ïŒã
- `gl.transformFeedbackVaryings`ã䜿çšããŠãé ç¹ã·ã§ãŒããŒãããã£ããã£ãã`varying`åºåãå®çŸ©ããã
- `gl.bindBufferBase`ãŸãã¯`gl.bindBufferRange`ã䜿çšããŠåºåãããã¡ããã€ã³ãããã
- æç»ã³ãŒã«ã®åã«`gl.beginTransformFeedback`ãåŒã³åºããåŸã«`gl.endTransformFeedback`ãåŒã³åºãã
ããã«ãããGPUäžã«éã«ãŒããäœæãããããŒã¿äžŠåã¿ã¹ã¯ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
é ç¹ãã¯ã¹ãã£ãã§ããïŒVTF / WebGL 2.0ïŒ
é ç¹ãã¯ã¹ãã£ãã§ããããŸãã¯VTFã¯ãé ç¹ã·ã§ãŒããŒããã¯ã¹ãã£ããããŒã¿ããµã³ããªã³ã°ã§ããããã«ãããã®ã§ããããã¯åçŽã«èããããããããŸãããã以åã¯å¹ççã«éæããããšãå°é£ãŸãã¯äžå¯èœã ã£ããé ç¹ããŒã¿ãæäœããããã®åŒ·åãªæè¡ãè§£ãæŸã¡ãŸãã
æŠå¿µïŒé ç¹ã®ããã®ãã¯ã¹ãã£ããŒã¿
éåžžããã¯ã¹ãã£ã¯ãã¯ã»ã«ãçè²ããããã«ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§ãµã³ããªã³ã°ãããŸããVTFã¯ãé ç¹ã·ã§ãŒããŒããã¯ã¹ãã£ããããŒã¿ãèªã¿åãããšãå¯èœã«ããŸãããã®ããŒã¿ã¯ãå€äœå€ããã¢ãã¡ãŒã·ã§ã³ããŒãã¬ãŒã ãŸã§ãäœã§ã衚çŸã§ããŸãã
ããè€éãªé ç¹æäœã®æå¹å
- ã¢ãŒãã£ã³ã°ã¿ãŒã²ããã¢ãã¡ãŒã·ã§ã³ïŒç°ãªãã¡ãã·ã¥ããŒãºïŒã¢ãŒãã£ã³ã°ã¿ãŒã²ããïŒããã¯ã¹ãã£ã«ä¿åããŸããé ç¹ã·ã§ãŒããŒã¯ãã¢ãã¡ãŒã·ã§ã³ãŠã§ã€ãã«åºã¥ããŠãããã®ããŒãºéãè£éãããã¬ãŒã ããšã«åå¥ã®é ç¹ãããã¡ãå¿ èŠãšããã«æ»ãããªãã£ã©ã¯ã¿ãŒã¢ãã¡ãŒã·ã§ã³ãäœæã§ããŸããããã¯ãæ ç»çãªãã¬ãŒã³ããŒã·ã§ã³ãã€ã³ã¿ã©ã¯ãã£ããªã¹ããŒãªãŒãªã©ããªããã§ç©èªäž»å°ã®äœéšã«äžå¯æ¬ ã§ãã
- ãã£ã¹ãã¬ã€ã¹ã¡ã³ããããã³ã°ïŒãã€ãããããã¯ã¹ãã£ã䜿çšããŠãé ç¹äœçœ®ãæ³ç·ã«æ²¿ã£ãŠå€äœãããããŒã¹ã¡ãã·ã¥ã®é ç¹æ°ãå¢ããããšãªããµãŒãã§ã¹ã«çްãã幟äœåŠç詳现ã远å ããŸããããã«ãããèããå°åœ¢ãè€éãªãã¿ãŒã³ããŸãã¯åçãªæµäœè¡šé¢ãã·ãã¥ã¬ãŒãã§ããŸãã
- GPUã¹ããã³ã°/ã¹ã±ã«ã¿ã«ã¢ãã¡ãŒã·ã§ã³ïŒããŒã³å€æè¡åããã¯ã¹ãã£ã«ä¿åããŸããé ç¹ã·ã§ãŒããŒã¯ãããã®è¡åãèªã¿åããããŒã³ãŠã§ã€ããšã€ã³ããã¯ã¹ã«åºã¥ããŠé ç¹ã«é©çšããã¹ããã³ã°ãå®å šã«GPUäžã§å®è¡ããŸããããã«ãããéåžžã¯ãããªãã¯ã¹ãã¬ããã¢ãã¡ãŒã·ã§ã³ã«è²»ããããããªãã®CPUãªãœãŒã¹ãè§£æŸãããŸãã
VTFã¯é ç¹ã·ã§ãŒããŒã®èœåãå€§å¹ ã«æ¡åŒµããGPUäžã§çŽæ¥ãéåžžã«åçã§è©³çްãªãžãªã¡ããªæäœãå¯èœã«ãã倿§ãªããŒããŠã§ã¢ç°å¢ã§ããèŠèŠçã«è±ãã§ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ã«ã€ãªãããŸãã
å®è£ ã«é¢ããèæ ®äºé
VTFã§ã¯ãé ç¹ã·ã§ãŒããŒå ã§`texture2D`ïŒãŸãã¯GLSL 300 ESã§ã¯`texture`ïŒã䜿çšããŸãããã¯ã¹ãã£ãŠããããé ç¹ã·ã§ãŒããŒã¢ã¯ã»ã¹çšã«æ£ããæ§æããããã€ã³ããããŠããããšã確èªããŠãã ãããæå€§ãã¯ã¹ãã£ãµã€ãºãšç²ŸåºŠã¯ããã€ã¹ã«ãã£ãŠç°ãªãå Žåããããããã°ããŒãã«ã«ä¿¡é Œæ§ã®é«ãããã©ãŒãã³ã¹ãåŸãã«ã¯ãããŸããŸãªããŒããŠã§ã¢ïŒäŸïŒæºåž¯é»è©±ãçµ±åã°ã©ãã£ãã¯ã¹ã®ã©ãããããããã€ãšã³ããã¹ã¯ãããïŒã§ãã¹ãããããšãäžå¯æ¬ ã§ãã
ã³ã³ãã¥ãŒãã·ã§ãŒããŒïŒWebGPUã®æªæ¥ããã ãWebGLã®å¶éã«ã€ããŠãèšåïŒ
WebGLã®çŽæ¥çãªäžéšã§ã¯ãããŸããããã³ã³ãã¥ãŒãã·ã§ãŒããŒã«ã€ããŠç°¡åã«è§ŠããŠãã䟡å€ããããŸãããããã¯ãWebGLã®åŸç¶ã§ããWebGPUã®ãããªæ¬¡äžä»£APIã®äžæ žæ©èœã§ããã³ã³ãã¥ãŒãã·ã§ãŒããŒã¯æ±çšã®GPUã³ã³ãã¥ãŒãã£ã³ã°æ©èœãæäŸããéçºè ã¯ã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã«çžãããããšãªãGPUäžã§ä»»æã®äžŠåèšç®ãå®è¡ã§ããŸããããã«ããããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãããããã«æè»ã§åŒ·åãªæ¹æ³ã§é ç¹ããŒã¿ãçæããã³åŠçããå¯èœæ§ãåºãããããã«æŽç·Žãããã·ãã¥ã¬ãŒã·ã§ã³ãããã·ãŒãžã£ã«çæãAIé§åã®ãšãã§ã¯ããGPUäžã§çŽæ¥å®çŸã§ããŸããWebGPUã®æ¡çšãäžççã«åºããã«ã€ããŠããããã®æ©èœã¯é ç¹åŠçã®æé©åã®å¯èœæ§ãããã«é«ããã§ãããã
å®è·µçãªå®è£ æè¡ãšãã¹ããã©ã¯ãã£ã¹
æé©åã¯å埩çãªããã»ã¹ã§ããæž¬å®ãæ å ±ã«åºã¥ããæ±ºå®ããããŠç¶ç¶çãªæ¹åãå¿ èŠã§ããããã§ã¯ãã°ããŒãã«ãªWebGLéçºã®ããã®å®è·µçãªæè¡ãšãã¹ããã©ã¯ãã£ã¹ã玹ä»ããŸãã
ãããã¡ã€ãªã³ã°ãšãããã°ïŒããã«ããã¯ã®è§£æ
枬å®ããªããã®ã¯æé©åã§ããŸããããããã¡ã€ãªã³ã°ããŒã«ã¯äžå¯æ¬ ã§ãã
- ãã©ãŠã¶éçºè ããŒã«ïŒ
- Firefox RDM (Remote Debugging Monitor) & WebGL ProfilerïŒè©³çްãªãã¬ãŒã ããšã®åæãã·ã§ãŒããŒè¡šç€ºãã³ãŒã«ã¹ã¿ãã¯ãããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãæäŸããŸãã
- Chrome DevTools (Performance Tab, WebGL Insights Extension)ïŒCPU/GPUã®ã¢ã¯ãã£ããã£ã°ã©ããæç»ã³ãŒã«ã®ã¿ã€ãã³ã°ãWebGLã®ç¶æ ã«é¢ããã€ã³ãµã€ããæäŸããŸãã
- Safari Web InspectorïŒãã¬ãŒã ããã£ããã£ããWebGLã³ãŒã«ãæ€æ»ããããã®ã°ã©ãã£ãã¯ã¹ã¿ããå«ãŸããŠããŸãã
- `gl.getExtension('WEBGL_debug_renderer_info')`ïŒGPUãã³ããŒãšã¬ã³ãã©ãŒã«é¢ããæ å ±ãæäŸããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ã®ããããŒããŠã§ã¢ã®ä»æ§ãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
- ãã¬ãŒã ãã£ããã£ããŒã«ïŒå°éããŒã«ïŒäŸïŒSpector.jsããŸãã¯ãã©ãŠã¶çµ±åããŒã«ïŒã¯ãåäžãã¬ãŒã ã®WebGLã³ãã³ãããã£ããã£ããã³ãŒã«ãã¹ãããå®è¡ããŠç¶æ ãæ€æ»ã§ãããããéå¹çæ§ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
ãããã¡ã€ãªã³ã°ããéã¯ã以äžã«æ³šæããŠãã ããïŒ
- `gl`ã³ãŒã«ã«è²»ããããé«ãCPUæéïŒæç»ã³ãŒã«ãç¶æ 倿Žãå€ãããããšã瀺åïŒã
- ãã¬ãŒã ãããã®GPUæéã®æ¥å¢ïŒè€éãªã·ã§ãŒããŒããžãªã¡ããªãå€ãããããšã瀺åïŒã
- ç¹å®ã®ã·ã§ãŒããŒã¹ããŒãžã®ããã«ããã¯ïŒäŸïŒé ç¹ã·ã§ãŒããŒãé·ãããïŒã
é©åãªããŒã«/ã©ã€ãã©ãªã®éžæïŒã°ããŒãã«ãªãªãŒãã®ããã®æœè±¡å
äœã¬ãã«ã®WebGL APIãçè§£ããããšã¯æ·±ãæé©åã«äžå¯æ¬ ã§ããã確ç«ããã3Dã©ã€ãã©ãªã掻çšããããšã§ãéçºãå€§å¹ ã«å¹çåããå€ãã®å Žåãããã«äœ¿ããããã©ãŒãã³ã¹æé©åãæäŸã§ããŸãããããã®ã©ã€ãã©ãªã¯å€æ§ãªåœéããŒã ã«ãã£ãŠéçºãããäžçäžã§äœ¿çšãããŠãããå¹ åºãäºææ§ãšãã¹ããã©ã¯ãã£ã¹ãä¿èšŒããŸãã
- three.jsïŒWebGLã®è€éãã®å€ããæœè±¡åãã匷åã§åºã䜿çšãããŠããã©ã€ãã©ãªããžãªã¡ããªïŒäŸïŒ`BufferGeometry`ïŒãã€ã³ã¹ã¿ã³ã¹åãå¹ççãªã·ãŒã³ã°ã©ã管çã®ããã®æé©åãå«ãŸããŠããŸãã
- Babylon.jsïŒãã1ã€ã®å ç¢ãªãã¬ãŒã ã¯ãŒã¯ã§ãã²ãŒã éçºãè€éãªã·ãŒã³ã¬ã³ããªã³ã°ã®ããã®å æ¬çãªããŒã«ãæäŸããçµã¿èŸŒã¿ã®ããã©ãŒãã³ã¹ããŒã«ãšæé©åãåããŠããŸãã
- PlayCanvasïŒãã©ãŠã¶ã§å®è¡ããããã«ã¹ã¿ãã¯ã®3Dã²ãŒã ãšã³ãžã³ã§ããã®ããã©ãŒãã³ã¹ãšã¯ã©ãŠãããŒã¹ã®éçºç°å¢ã§ç¥ãããŠããŸãã
- A-FrameïŒVR/ARäœéšãæ§ç¯ããããã®Webãã¬ãŒã ã¯ãŒã¯ã§ãthree.jsäžã«æ§ç¯ãããè¿ éãªéçºã®ããã«å®£èšçãªHTMLã«çŠç¹ãåœãŠãŠããŸãã
ãããã®ã©ã€ãã©ãªã¯ãæ£ãã䜿çšããã°ãããã§èª¬æããæé©åã®å€ããå®è£ ããé«ã¬ãã«APIãæäŸããéçºè ãã°ããŒãã«ãªãŠãŒã¶ãŒããŒã¹å šäœã§è¯å¥œãªããã©ãŒãã³ã¹ãç¶æããªãããåµé çãªåŽé¢ã«éäžã§ããããã«ããŸãã
ããã°ã¬ãã·ãã¬ã³ããªã³ã°ïŒç¥èŠãããããã©ãŒãã³ã¹ã®åäž
éåžžã«è€éãªã·ãŒã³ãäœéãªããã€ã¹ã®å Žåããã¹ãŠãããã«æé«å質ã§èªã¿èŸŒãã§ã¬ã³ããªã³ã°ãããšãç¥èŠçãªé å»¶ã«ã€ãªããå¯èœæ§ããããŸããããã°ã¬ãã·ãã¬ã³ããªã³ã°ã¯ãã·ãŒã³ã®äœå質ããŒãžã§ã³ãè¿ éã«è¡šç€ºãããã®åŸåŸã ã«ãããåäžãããããšãå«ã¿ãŸãã
- åæã®äœè©³çްã¬ã³ããªã³ã°ïŒç°¡ç¥åããããžãªã¡ããªïŒäœLODïŒãå°ãªãã©ã€ãããŸãã¯åºæ¬çãªãããªã¢ã«ã§ã¬ã³ããªã³ã°ããŸãã
- éåæèªã¿èŸŒã¿ïŒé«è§£å床ã®ãã¯ã¹ãã£ãšã¢ãã«ãããã¯ã°ã©ãŠã³ãã§èªã¿èŸŒã¿ãŸãã
- 段éçãªåŒ·åïŒãªãœãŒã¹ãèªã¿èŸŒãŸããŠå©çšå¯èœã«ãªã£ãããåŸã ã«é«å質ãªã¢ã»ããã«äº€æããããããè€éãªã¬ã³ããªã³ã°æ©èœãæå¹ã«ãããããŸãã
ãã®ã¢ãããŒãã¯ãç¹ã«ã€ã³ã¿ãŒãããæ¥ç¶ãé ããŠãŒã¶ãŒãæ§èœã®äœãããŒããŠã§ã¢ã䜿çšããŠãããŠãŒã¶ãŒã«ãšã£ãŠããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžãããå Žæãããã€ã¹ã«é¢ä¿ãªããåºæ¬çãªã¬ãã«ã®ã€ã³ã¿ã©ã¯ãã£ããã£ãä¿èšŒããŸãã
ã¢ã»ããæé©åã¯ãŒã¯ãããŒïŒå¹çã®æºæ³
æé©åã¯ãã¢ãã«ãWebGLã¢ããªã±ãŒã·ã§ã³ã«å°éããåããå§ãŸããŸãã
- å¹ççãªã¢ãã«ã®ãšã¯ã¹ããŒãïŒBlenderãMayaãZBrushãªã©ã®ããŒã«ã§3Dã¢ãã«ãäœæããéã¯ãæé©åãããããããžãé©åãªããªãŽã³æ°ãæ£ããUVãããã³ã°ã§ãšã¯ã¹ããŒããããããšã確èªããŸããäžèŠãªããŒã¿ïŒäŸïŒé ããé¢ãå€ç«ããé ç¹ïŒãåé€ããŸãã
- å§çž®ïŒ3Dã¢ãã«ã«ã¯glTFïŒGL Transmission FormatïŒã䜿çšããŸããããã¯ãWebGLã«ãã3Dã·ãŒã³ãšã¢ãã«ã®å¹ççãªäŒéãšèªã¿èŸŒã¿ã®ããã«èšèšããããªãŒãã³ã¹ã¿ã³ããŒãã§ããglTFã¢ãã«ã«Dracoå§çž®ãé©çšãããšããã¡ã€ã«ãµã€ãºãå€§å¹ ã«åæžã§ããŸãã
- ãã¯ã¹ãã£ã®æé©åïŒé©åãªãã¯ã¹ãã£ãµã€ãºãšãã©ãŒãããïŒäŸïŒWebPãGPUãã€ãã£ãå§çž®çšã®KTX2ïŒã䜿çšãããããããããçæããŸãã
ã¯ãã¹ãã©ãããã©ãŒã /ã¯ãã¹ããã€ã¹ã®èæ ®äºé ïŒã°ããŒãã«ãªå¿ é äºé
WebGLã¢ããªã±ãŒã·ã§ã³ã¯ãéåžžã«å€æ§ãªããã€ã¹ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§å®è¡ãããŸãããã€ãšã³ãã®ãã¹ã¯ãããã§ããŸãæ©èœãããã®ããäžäŸ¡æ Œåž¯ã®æºåž¯é»è©±ã麻çºãããå¯èœæ§ããããŸããã°ããŒãã«ãªããã©ãŒãã³ã¹ã®ããã«èšèšããã«ã¯ãæè»ãªã¢ãããŒããå¿ èŠã§ãã
- GPUèœåã®ã°ãã€ãïŒã¢ãã€ã«GPUã¯äžè¬ã«ãå°çšã®ãã¹ã¯ãããGPUããããã£ã«ã¬ãŒããã¡ã¢ãªåž¯åå¹ ãã·ã§ãŒããŒåŠçèœåãäœãã§ãããããã®å¶éã«æ³šæããŠãã ããã
- æ¶è²»é»åã®ç®¡çïŒããããªãŒé§åã®ããã€ã¹ã§ã¯ãé«ããã¬ãŒã ã¬ãŒãã¯æ¥éã«é»åãæ¶è²»ããå¯èœæ§ããããŸããããã€ã¹ãã¢ã€ãã«ç¶æ ãŸãã¯ããããªãŒæ®éãå°ãªãå Žåã¯ãé©å¿çãªãã¬ãŒã ã¬ãŒããã¬ã³ããªã³ã°ã®ã¹ããããªã³ã°ãæ€èšããŠãã ããã
- é©å¿ã¬ã³ããªã³ã°ïŒããã€ã¹ã®ããã©ãŒãã³ã¹ã«åºã¥ããŠã¬ã³ããªã³ã°å質ãåçã«èª¿æŽããæŠç¥ãå®è£ ããŸããããã«ã¯ãLODã®åãæ¿ããããŒãã£ã¯ã«æ°ã®åæžãã·ã§ãŒããŒã®ç°¡ç¥åããŸãã¯æ§èœã®äœãããã€ã¹ã§ã®ã¬ã³ããªã³ã°è§£å床ã®äœäžãå«ãŸããå ŽåããããŸãã
- ãã¹ãïŒçŸå®äžçã®ããã©ãŒãã³ã¹ç¹æ§ãçè§£ããããã«ãå¹ åºãããã€ã¹ïŒäŸïŒå€ãAndroidæºåž¯ãææ°ã®iPhoneãããŸããŸãªã©ãããããããã¹ã¯ãããïŒã§ã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããŸãã
ã±ãŒã¹ã¹ã¿ãã£ãšã°ããŒãã«ãªäŸïŒæŠå¿µçïŒ
é ç¹åŠçã®æé©åã®çŸå®äžçã§ã®åœ±é¿ã瀺ãããã«ãã°ããŒãã«ãªèŠèŽè ã«å ±æãåŒã¶ããã€ãã®æŠå¿µçãªã·ããªãªãèããŠã¿ãŸãããã
åœéäŒæ¥åãã®å»ºç¯ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³
ãã³ãã³ããã¥ãŒãšãŒã¯ãã·ã³ã¬ããŒã«ã«ãªãã£ã¹ãæ§ãã建ç¯äºåæããäžçäžã®ã¯ã©ã€ã¢ã³ãã«æ°ããè¶ é«å±€ãã«ã®ãã¶ã€ã³ãæç€ºããããã®WebGLã¢ããªã±ãŒã·ã§ã³ãéçºããŸããã¢ãã«ã¯éåžžã«è©³çްã§ãäœçŸäžãã®é ç¹ãå«ãã§ããŸããé©åãªé ç¹åŠçã®æé©åããªããã°ãã¢ãã«ã®ããã²ãŒã·ã§ã³ã¯é ããªããã¯ã©ã€ã¢ã³ãã®äžæºãæ©äŒæå€±ã«ã€ãªãããŸãã
- 解決çïŒåç€Ÿã¯æŽç·ŽãããLODã·ã¹ãã ãå®è£ ããŸããé ããã建ç©å šäœã衚瀺ããå ŽåãåçŽãªãããã¯ã¢ãã«ãã¬ã³ããªã³ã°ãããŸãããŠãŒã¶ãŒãç¹å®ã®ããã¢ãéšå±ã«ãºãŒã ã€ã³ãããšããã詳现ãªã¢ãã«ãèªã¿èŸŒãŸããŸããçªãåºã¿ã€ã«ããªãã£ã¹ã®å®¶å ·ãªã©ã®å埩çãªèŠçŽ ã«ã¯ã€ã³ã¹ã¿ã³ã¹åã䜿çšãããŸããGPUé§åã®ã«ãªã³ã°ã«ãããå·šå€§ãªæ§é ã®å¯èŠéšåã®ã¿ãé ç¹ã·ã§ãŒããŒã§åŠçãããããã«ãªããŸãã
- çµæïŒã¯ã©ã€ã¢ã³ãã®iPadãããã€ãšã³ãã®ã¯ãŒã¯ã¹ããŒã·ã§ã³ãŸã§ãããŸããŸãªããã€ã¹ã§ã¹ã ãŒãºã§ã€ã³ã¿ã©ã¯ãã£ããªãŠã©ãŒã¯ã¹ã«ãŒãå¯èœã«ãªãããã¹ãŠã®ã°ããŒãã«ãªãã£ã¹ãšã¯ã©ã€ã¢ã³ãã«äžè²«ããå°è±¡çãªãã¬ãŒã³ããŒã·ã§ã³äœéšãä¿èšŒããŸãã
ã°ããŒãã«ãªè£œåã«ã¿ãã°ã®ããã®eã³ããŒã¹3Dãã¥ãŒã¢
ã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ã¯ãè€éãªãžã¥ãšãªãŒããèšå®å¯èœãªå®¶å ·ãŸã§ã補åã«ã¿ãã°ã®ã€ã³ã¿ã©ã¯ãã£ããª3Dãã¥ãŒãååœã®é¡§å®¢ã«æäŸããããšãç®æããŠããŸããé«éãªèªã¿èŸŒã¿ãšã¹ã ãŒãºãªã€ã³ã¿ã©ã¯ã·ã§ã³ã¯ãã³ã³ããŒãžã§ã³çã«ãšã£ãŠéèŠã§ãã
- 解決çïŒè£œåã¢ãã«ã¯ãã¢ã»ãããã€ãã©ã€ã³äžã«ã¡ãã·ã¥ã®éåŒãã䜿çšããŠå€§å¹ ã«æé©åãããŸããé ç¹å±æ§ã¯æ éã«ããã¯ãããŸããå€ãã®å°ããªã³ã³ããŒãã³ããé¢äžããå¯èœæ§ãããèšå®å¯èœãªè£œåã§ã¯ãæšæºã³ã³ããŒãã³ãïŒäŸïŒãã«ãããã³ãžïŒã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãæç»ããããã«ã€ã³ã¹ã¿ã³ã¹åã䜿çšãããŸããVTFã¯ãåžå°ã®åŸ®åŠãªãã£ã¹ãã¬ã€ã¹ã¡ã³ããããã³ã°ããç°ãªã補åããªãšãŒã·ã§ã³éã®ã¢ãŒãã£ã³ã°ã«æ¡çšãããŸãã
- çµæïŒæ±äº¬ããã«ãªã³ããŸãã¯ãµã³ããŠãã®é¡§å®¢ã¯ã補åã¢ãã«ãå³åº§ã«èªã¿èŸŒã¿ãã¹ã ãŒãºã«æäœã§ãããªã¢ã«ã¿ã€ã ã§ã¢ã€ãã ãå転ããºãŒã ãèšå®ã§ããããããšã³ã²ãŒãžã¡ã³ããšè³Œå ¥ææ¬²ãåäžããŸãã
åœéçãªç ç©¶ååã®ããã®ç§åŠããŒã¿å¯èŠå
ãã¥ãŒãªããããã³ã¬ããŒã«ãã¡ã«ãã«ã³ã®ç ç©¶æã®ç§åŠè ããŒã ããååæ§é ãæ°åã·ãã¥ã¬ãŒã·ã§ã³ã倩äœçŸè±¡ãªã©ã®å€§èŠæš¡ãªããŒã¿ã»ããã®å¯èŠåã§ååããŠããŸãããããã®å¯èŠåã¯ããã°ãã°å¹ŸäœåŠçãªããªããã£ãã«å€æãããæ°ååã®ããŒã¿ãã€ã³ãã䌎ããŸãã
- 解決çïŒãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãCPUã®ä»å ¥ãªãã«æ°ååã®ããŒãã£ã¯ã«ãã·ãã¥ã¬ãŒãããã³ã¬ã³ããªã³ã°ãããGPUããŒã¹ã®ããŒãã£ã¯ã«ã·ãã¥ã¬ãŒã·ã§ã³ã«æŽ»çšãããŸããVTFã¯ãã·ãã¥ã¬ãŒã·ã§ã³çµæã«åºã¥ãåçãªã¡ãã·ã¥å€åœ¢ã«äœ¿çšãããŸããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã¯ãå埩çãªå¯èŠåèŠçŽ ã«ã€ã³ã¹ã¿ã³ã¹åãç©æ¥µçã«äœ¿çšããé ãã®ããŒã¿ãã€ã³ãã«LODæè¡ãé©çšããŸãã
- çµæïŒç ç©¶è ã¯åºå€§ãªããŒã¿ã»ãããã€ã³ã¿ã©ã¯ãã£ãã«æ¢çŽ¢ããè€éãªã·ãã¥ã¬ãŒã·ã§ã³ããªã¢ã«ã¿ã€ã ã§æäœããã¿ã€ã ãŸãŒã³ãè¶ããŠå¹æçã«ååã§ãããããç§åŠççºèŠãšçè§£ãå éãããŸãã
å ¬å ±ã¹ããŒã¹åãã®ã€ã³ã¿ã©ã¯ãã£ãã¢ãŒãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³
åœéçãªã¢ãŒãã³ã¬ã¯ãã£ããããã³ã¯ãŒããŒããããã€ãŸã§ã®éœåžã®åºå Žã«å±éããããWebGLãæèŒããã€ã³ã¿ã©ã¯ãã£ããªãããªãã¯ã¢ãŒãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ããã¶ã€ã³ããŸãããã®ã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ã¯ãç°å¢å ¥åïŒé³ãåãïŒã«åå¿ããçæçã§ææ©çãªåœ¢ãç¹åŸŽãšããŠããŸãã
- 解決çïŒããã·ãŒãžã£ã«ãžãªã¡ããªã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã䜿çšããŠçæãããç¶ç¶çã«æŽæ°ãããGPUäžã§çŽæ¥åçã§é²åããã¡ãã·ã¥ãäœæããŸããé ç¹ã·ã§ãŒããŒã¯ãæ¬è³ªçãªå€æã«çŠç¹ãåœãŠãVTFãå©çšããŠåçãªå€äœã远å ããè€éãªè©³çްãå ããããšã§ãã¹ãªã ã«ä¿ãããŸããã€ã³ã¹ã¿ã³ã¹åã¯ãã¢ãŒãããŒã¹å ã®å埩ãã¿ãŒã³ãããŒãã£ã¯ã«ãšãã§ã¯ãã«äœ¿çšãããŸãã
- çµæïŒãã®ã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ã¯ãåã蟌ã¿ããŒããŠã§ã¢äžã§å®ç§ã«åäœãããæµåçã§é åçã§ãŠããŒã¯ãªèŠèŠäœéšãæäŸããæè¡çãªèæ¯ãå°ççãªå Žæã«é¢ä¿ãªãã倿§ãªèг客ãé äºããŸãã
WebGLé ç¹åŠçã®æªæ¥ïŒWebGPUãšãã®å
WebGL 2.0ã¯é ç¹åŠçã®ããã®åŒ·åãªããŒã«ãæäŸããŸãããWebã°ã©ãã£ãã¯ã¹ã®é²åã¯ç¶ããŠããŸããWebGPUã¯æ¬¡äžä»£ã®Webæšæºã§ãããGPUããŒããŠã§ã¢ãžã®ããã«äœã¬ãã«ã®ã¢ã¯ã»ã¹ãšãããçŸä»£çãªã¬ã³ããªã³ã°æ©èœãæäŸããŸããæç€ºçãªã³ã³ãã¥ãŒãã·ã§ãŒããŒã®å°å ¥ã¯ãé ç¹åŠçã«ãšã£ãŠã²ãŒã ãã§ã³ãžã£ãŒãšãªããWebGLã§ã¯çŸåšéæãããå°é£ãªãéåžžã«æè»ã§å¹ççãªGPUããŒã¹ã®ãžãªã¡ããªçæã倿Žãç©çã·ãã¥ã¬ãŒã·ã§ã³ãå¯èœã«ããŸããããã«ãããéçºè ã¯äžçäžã§ããã«åªããããã©ãŒãã³ã¹ãæã€ãä¿¡ããããªãã»ã©ãªããã§ãã€ãããã¯ãª3Däœéšãåµé ã§ããããã«ãªãã§ãããã
ããããWebGLã®é ç¹åŠçãšæé©åã®åºæ¬ãçè§£ããããšã¯äŸç¶ãšããŠéèŠã§ããããŒã¿ã®æå°åãå¹ççãªã·ã§ãŒããŒèšèšãGPUã®äžŠååŠçã®æŽ»çšãšãã£ãååã¯äžå€ã§ãããæ°ããAPIãç»å ŽããŠãåŒãç¶ãéèŠã§ããç¶ããŸãã
çµè«ïŒé«æ§èœWebGLãžã®é
WebGLãžãªã¡ããªãã€ãã©ã€ã³ãç¹ã«é ç¹åŠçã®æé©åã¯ãåãªãæè¡çãªæŒç¿ã§ã¯ãããŸãããããã¯ã説åŸåãããã¢ã¯ã»ã¹ãããã3Däœéšãã°ããŒãã«ãªèŠèŽè ã«æäŸããããã®éèŠãªèŠçŽ ã§ããåé·ãªããŒã¿ã®åæžãããã€ã³ã¹ã¿ã³ã¹åããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®ãããªé«åºŠãªGPUæ©èœã®æ¡çšãŸã§ãå¹çæ§ãé«ããããã®ãã¹ãŠã®ã¹ãããããããã¹ã ãŒãºã§ãããé åçã§ãããå æ¬çãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«è²¢ç®ããŸãã
髿§èœãªWebGLãžã®éã®ãã¯å埩çã§ããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®æ·±ãçè§£ããããã¡ã€ãªã³ã°ãšãããã°ãžã®åãçµã¿ããããŠæ°ããæè¡ã®ç¶ç¶çãªæ¢æ±ãæ±ããããŸãããã®ã¬ã€ãã§æŠèª¬ãããæŠç¥ãåãå ¥ããããšã§ãäžçäžã®éçºè ã¯ãèŠèŠçãªå¿ å®åºŠã®éçãæŒãåºããã ãã§ãªããçžäºæ¥ç¶ãããããžã¿ã«äžçãå®çŸ©ãã倿§ãªããã€ã¹ããããã¯ãŒã¯æ¡ä»¶ã§å®ç§ã«åäœããWebGLã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãããããã®åŒ·åãåãå ¥ããããªãã®WebGLäœåãã©ãã§ãæããèŒãããŸãããã