WebGLã¡ãã·ã¥ã·ã§ãŒããŒã®ããªããã£ãå¢å¹ ãæ¢æ±ãåçãžãªã¡ããªçæã®ããã®åŒ·åãªãã¯ããã¯ããã€ãã©ã€ã³ãå©ç¹ãããã©ãŒãã³ã¹ãçè§£ã
WebGLã¡ãã·ã¥ã·ã§ãŒã㌠ããªããã£ãå¢å¹ : ãžãªã¡ããªä¹ç®ã®è©³çް
ã°ã©ãã£ãã¯ã¹APIã®é²åã¯ãGPUäžã§çŽæ¥ãžãªã¡ããªãæäœããããã®åŒ·åãªããŒã«ããããããŸãããã¡ãã·ã¥ã·ã§ãŒããŒã¯ããã®åéã«ããã倧ããªé²æ©ã衚ããŠããããããŸã§ã«ãªãæè»æ§ãšããã©ãŒãã³ã¹ã®åäžãæäŸããŸããã¡ãã·ã¥ã·ã§ãŒããŒã®æãé åçãªæ©èœã®1ã€ã¯ãããªããã£ãå¢å¹ ã§ãããåçãžãªã¡ããªçæãšä¹ç®ãå¯èœã«ããŸãããã®ããã°èšäºã§ã¯ãWebGLã¡ãã·ã¥ã·ã§ãŒããŒã®ããªããã£ãå¢å¹ ãå æ¬çã«æ¢æ±ãããã®ãã€ãã©ã€ã³ãå©ç¹ãããã³ããã©ãŒãã³ã¹ãžã®åœ±é¿ã«ã€ããŠè©³ãã説æããŸãã
åŸæ¥ã®ã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã®çè§£
ã¡ãã·ã¥ã·ã§ãŒããŒãæ·±ãæãäžããåã«ãåŸæ¥ã®ã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã®å¶éãçè§£ããããšãéèŠã§ããåºå®æ©èœãã€ãã©ã€ã³ã¯ãéåžžãæ¬¡ã®ãã®ãå«ã¿ãŸãã
- é ç¹ã·ã§ãŒããŒ: åã ã®é ç¹ãåŠçããã¢ãã«ããã¥ãŒãããã³æåœ±è¡åã«åºã¥ããŠå€æããŸãã
- ãžãªã¡ããªã·ã§ãŒããŒïŒãªãã·ã§ã³ïŒ: ããªããã£ãå šäœïŒäžè§åœ¢ãç·ãç¹ïŒãåŠçãããžãªã¡ããªã®å€æŽãŸãã¯äœæãå¯èœã«ããŸãã
- ã©ã¹ã¿ã©ã€ãº: ããªããã£ãããã©ã°ã¡ã³ãïŒãã¯ã»ã«ïŒã«å€æããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒ: åã ã®ãã©ã°ã¡ã³ããåŠçãããã®è²ãšæ·±ããæ±ºå®ããŸãã
ãžãªã¡ããªã·ã§ãŒããŒã¯ãããã€ãã®ãžãªã¡ããªæäœæ©èœãæäŸããŸããããã®éããã䞊ååŠçãšæè»æ§ã®ãªãå ¥åºåãåå ã§ãå€ãã®å Žåããã«ããã¯ã«ãªããŸããããªããã£ãå šäœãé çªã«åŠçãããããç¹ã«è€éãªãžãªã¡ããªãéã倿ãè¡ãå Žåã«ãããã©ãŒãã³ã¹ã劚ããããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã®ç޹ä»: æ°ãããã©ãã€ã
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãåŸæ¥ã®é ç¹ã·ã§ãŒããŒãšãžãªã¡ããªã·ã§ãŒããŒã«ä»£ãããããæè»ã§å¹ççãªä»£æ¿ææ®µãæäŸããŸãããããã¯ããžãªã¡ããªåŠçã®ããã®æ°ãããã©ãã€ã ãå°å ¥ãããããã现ããå¶åŸ¡ãšäžŠååŠçã®åŒ·åãå¯èœã«ããŸããã¡ãã·ã¥ã·ã§ãŒããŒãã€ãã©ã€ã³ã¯ã次ã®2ã€ã®äž»èŠãªã¹ããŒãžã§æ§æãããŠããŸãã
- ã¿ã¹ã¯ã·ã§ãŒããŒïŒãªãã·ã§ã³ïŒ: ã¡ãã·ã¥ã·ã§ãŒããŒã®äœæ¥éãšåæ£ã決å®ããŸããèµ·åããã¡ãã·ã¥ã·ã§ãŒããŒã®åŒã³åºãåæ°ãæ±ºå®ãããããã«ããŒã¿ãæž¡ãããšãã§ããŸããããããå¢å¹ ãã¹ããŒãžã§ãã
- ã¡ãã·ã¥ã·ã§ãŒããŒ: ããŒã«ã«ã¯ãŒã¯ã°ã«ãŒãå ã§é ç¹ãšããªããã£ãïŒäžè§åœ¢ãç·ããŸãã¯ç¹ïŒãçæããŸãã
éèŠãªåºå¥ã¯ãã¿ã¹ã¯ã·ã§ãŒããŒãã¡ãã·ã¥ã·ã§ãŒããŒã«ãã£ãŠçæããããžãªã¡ããªã®éãå¢å¹ ã§ããããšã§ããã¿ã¹ã¯ã·ã§ãŒããŒã¯ãåºæ¬çã«ãæçµçãªåºåãçæããããã«ãã©ã®ã¡ãã·ã¥ã¯ãŒã¯ã°ã«ãŒãããã£ã¹ãããããããæ±ºå®ããŸããããã«ãããåçãªè©³çŽ°åºŠïŒLODïŒå¶åŸ¡ãããã·ãŒãžã£ã«çæãããã³è€éãªãžãªã¡ããªæäœã®æ©äŒãéãããŸãã
ããªããã£ãå¢å¹ ã®è©³çް
ããªããã£ãå¢å¹ ãšã¯ãã¡ãã·ã¥ã·ã§ãŒããŒã«ãã£ãŠçæãããããªããã£ãïŒäžè§åœ¢ãç·ããŸãã¯ç¹ïŒã®æ°ãä¹ç®ããããã»ã¹ãæããŸããããã¯äž»ã«ã¿ã¹ã¯ã·ã§ãŒããŒã«ãã£ãŠå¶åŸ¡ãããèµ·åãããã¡ãã·ã¥ã·ã§ãŒããŒã®åŒã³åºãåæ°ãæ±ºå®ãããŸããæ¬¡ã«ãåã¡ãã·ã¥ã·ã§ãŒããŒã®åŒã³åºãã¯ãç¬èªã®ããªããã£ãã»ãããçæãã广çã«ãžãªã¡ããªãå¢å¹ ããŸãã
ãã®ä»çµã¿ã®å èš³ã以äžã«ç€ºããŸãã
- ã¿ã¹ã¯ã·ã§ãŒããŒã®åŒã³åºã: ã¿ã¹ã¯ã·ã§ãŒããŒã®åäžã®åŒã³åºããèµ·åãããŸãã
- ã¯ãŒã¯ã°ã«ãŒããã£ã¹ããã: ã¿ã¹ã¯ã·ã§ãŒããŒã¯ããã£ã¹ãããããã¡ãã·ã¥ã·ã§ãŒããŒã®ã¯ãŒã¯ã°ã«ãŒãæ°ã決å®ããŸããããããå¢å¹ ããçºçããå Žæã§ããã¯ãŒã¯ã°ã«ãŒãã®æ°ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒã®ã€ã³ã¹ã¿ã³ã¹ãããã€å®è¡ãããããæ±ºå®ããŸããåã¯ãŒã¯ã°ã«ãŒãã«ã¯ãæå®ãããæ°ã®ã¹ã¬ããïŒã·ã§ãŒããŒãœãŒã¹ã§æå®ïŒããããŸãã
- ã¡ãã·ã¥ã·ã§ãŒããŒã®å®è¡: åã¡ãã·ã¥ã·ã§ãŒããŒã®ã¯ãŒã¯ã°ã«ãŒãã¯ãäžé£ã®é ç¹ãšããªããã£ãïŒäžè§åœ¢ãç·ããŸãã¯ç¹ïŒãçæããŸãããããã®é ç¹ãšããªããã£ãã¯ãã¯ãŒã¯ã°ã«ãŒãå ã®å ±æã¡ã¢ãªã«æ ŒçŽãããŸãã
- åºåã¢ã»ã³ããª: GPUã¯ããã¹ãŠã®ã¡ãã·ã¥ã·ã§ãŒããŒã®ã¯ãŒã¯ã°ã«ãŒãã«ãã£ãŠçæãããããªããã£ãããã¬ã³ããªã³ã°çšã®æçµçãªã¡ãã·ã¥ã«çµã¿ç«ãŠãŸãã
å¹ççãªããªããã£ãå¢å¹ ã®éµã¯ãã¿ã¹ã¯ã·ã§ãŒããŒãšã¡ãã·ã¥ã·ã§ãŒããŒã«ãã£ãŠå®è¡ãããäœæ¥ã®ãã©ã³ã¹ãæ éã«åãããšã§ããã¿ã¹ã¯ã·ã§ãŒããŒã¯ãäž»ã«ã©ã®çšåºŠã®å¢å¹ ãå¿ èŠããæ±ºå®ããããšã«çŠç¹ãåœãŠãã¡ãã·ã¥ã·ã§ãŒããŒã¯å®éã®ãžãªã¡ããªçæãåŠçããå¿ èŠããããŸããã¿ã¹ã¯ã·ã§ãŒããŒã«è€éãªèšç®ãéè² è·ã«ãããšãã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããããšã®ããã©ãŒãã³ã¹äžã®å©ç¹ãæã¡æ¶ãããå¯èœæ§ããããŸãã
ããªããã£ãå¢å¹ ã®å©ç¹
ããªããã£ãå¢å¹ ã¯ãåŸæ¥ã®ãžãªã¡ããªåŠçæè¡ãšæ¯èŒããŠãããã€ãã®éèŠãªå©ç¹ãæäŸããŸãã
- åçãžãªã¡ããªçæ: ãªã¢ã«ã¿ã€ã ããŒã¿ãŸãã¯ããã·ãŒãžã£ã«ã¢ã«ãŽãªãºã ã«åºã¥ããŠãè€éãªãžãªã¡ããªããã®å Žã§äœæã§ããŸããCPUãŸãã¯ä»¥åã®ã³ã³ãã¥ãŒãã·ã§ãŒããŒãã¹ã§å®è¡ãããŠããã·ãã¥ã¬ãŒã·ã§ã³ã«ãã£ãŠåå²ã®æ°ã決å®ããããåçã«åå²ããæšãäœæããããšãæ³åããŠãã ããã
- ããã©ãŒãã³ã¹ã®åäž: ç¹ã«è€éãªãžãªã¡ããªãŸãã¯LODã·ããªãªã®å ŽåãCPUãšGPUéã§è»¢éããå¿ èŠã®ããããŒã¿ã®éãåæžããããšã«ãããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããå¶åŸ¡ããŒã¿ã®ã¿ãGPUã«éä¿¡ãããããã§æçµçãªã¡ãã·ã¥ãçµã¿ç«ãŠãããŸãã
- 䞊ååŠçã®å¢å : è€æ°ã®ã¡ãã·ã¥ã·ã§ãŒããŒã®åŒã³åºãã«ããã£ãŠãžãªã¡ããªçæã¯ãŒã¯ããŒãã忣ããããšã«ããããã倧ããªäžŠååŠçãå¯èœã«ããŸããã¯ãŒã¯ã°ã«ãŒãã¯äžŠåã«å®è¡ãããGPUã®å©çšçãæå€§åãããŸãã
- æè»æ§: ãžãªã¡ããªåŠçã«å¯Ÿãããããæè»ã§ããã°ã©ã å¯èœãªã¢ãããŒããæäŸããéçºè ãã«ã¹ã¿ã ãžãªã¡ããªã¢ã«ãŽãªãºã ãšæé©åãå®è£ ã§ããããã«ããŸãã
- CPUãªãŒããŒãããã®åæž: ãžãªã¡ããªçæãGPUã«ã·ããããããšã§ãCPUã®ãªãŒããŒããããåæžãããä»ã®ã¿ã¹ã¯ã®ããã«CPUãªãœãŒã¹ãè§£æŸãããŸããCPUããŠã³ãã®ã·ããªãªã§ã¯ããã®ã·ããã«ãããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããå¯èœæ§ããããŸãã
ããªããã£ãå¢å¹ ã®å®çšçãªäŸ
ããªããã£ãå¢å¹ ã®å¯èœæ§ã瀺ãå®çšçãªäŸã次ã«ç€ºããŸãã
- åç詳现床ïŒLODïŒ: ã¡ãã·ã¥ã®è©³çŽ°åºŠãã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠèª¿æŽããåçLODã¹ããŒã ãå®è£ ããŸããã¿ã¹ã¯ã·ã§ãŒããŒã¯è·é¢ãåæãããã®è·é¢ã«åºã¥ããŠã¡ãã·ã¥ã¯ãŒã¯ã°ã«ãŒãã®æ°ãå€ããŸãã¯å°ãªããã£ã¹ãããã§ããŸããé ãã®ãªããžã§ã¯ãã®å Žåãããå°ãªãã¯ãŒã¯ã°ã«ãŒããèµ·åãããããäœãè§£å床ã®ã¡ãã·ã¥ãçæãããŸããããè¿ããªããžã§ã¯ãã®å Žåãããå€ãã®ã¯ãŒã¯ã°ã«ãŒããèµ·åãããããé«ãè§£å床ã®ã¡ãã·ã¥ãçæãããŸããããã¯ãé ãã®å±±ãç®ã®åã®å°é¢ãããã¯ããã«å°ãªãäžè§åœ¢ã§è¡šçŸã§ããå°åœ¢ã¬ã³ããªã³ã°ã«ç¹ã«å¹æçã§ãã
- ããã·ãŒãžã£ã«å°åœ¢çæ: ããã·ãŒãžã£ã«ã¢ã«ãŽãªãºã ã䜿çšããŠãå°åœ¢ããã®å Žã§çæããŸããã¿ã¹ã¯ã·ã§ãŒããŒã¯å šäœã®å°åœ¢æ§é ãæ±ºå®ã§ããã¡ãã·ã¥ã·ã§ãŒããŒã¯é«ãããããŸãã¯ãã®ä»ã®ããã·ãŒãžã£ã«ããŒã¿ã«åºã¥ããŠè©³çްãªãžãªã¡ããªãçæã§ããŸããçŸå®çãªæµ·å²žç·ãå±±èãåçã«çæããããšãèããŠãã ããã
- ããŒãã£ã¯ã«ã·ã¹ãã : åããŒãã£ã¯ã«ãå°ããªã¡ãã·ã¥ïŒããšãã°ãäžè§åœ¢ãŸãã¯åè§åœ¢ïŒã§è¡šãããè€éãªããŒãã£ã¯ã«ã·ã¹ãã ãäœæããŸããããªããã£ãå¢å¹ ã䜿çšããŠãåããŒãã£ã¯ã«ã®ãžãªã¡ããªãå¹ççã«çæã§ããŸããæ°è±¡æ¡ä»¶ã«å¿ããŠéªçã®æ°ãåçã«å€åããå¹éªãã·ãã¥ã¬ãŒãããããšãæ³åããŠãã ããããã¹ãŠã¿ã¹ã¯ã·ã§ãŒããŒã«ãã£ãŠå¶åŸ¡ãããŸãã
- ãã©ã¯ã¿ã«: GPUäžã§ãã©ã¯ã¿ã«ãžãªã¡ããªãçæããŸããã¿ã¹ã¯ã·ã§ãŒããŒã¯å垰深床ãå¶åŸ¡ã§ããã¡ãã·ã¥ã·ã§ãŒããŒã¯åãã©ã¯ã¿ã«å埩ã®ãžãªã¡ããªãçæã§ããŸããåŸæ¥ã®æè¡ã§ã¯å¹ççã«ã¬ã³ããªã³ã°ããããšãäžå¯èœã§ãã£ãè€éãª3Dãã©ã¯ã¿ã«ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒãšå¢å¹ ã䜿çšããããšã§ãæ±ãããããªãå¯èœæ§ããããŸãã
- é«ªã®æ¯ãšæ¯ç®ã®ã¬ã³ããªã³ã°: ã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããŠãåã ã®é«ªã®æ¯ãŸãã¯æ¯ç®ã®æ¯æãçæããŸããã¿ã¹ã¯ã·ã§ãŒããŒã¯é«ª/æ¯ç®ã®å¯åºŠãå¶åŸ¡ã§ããã¡ãã·ã¥ã·ã§ãŒããŒã¯åæ¯æã®ãžãªã¡ããªãçæã§ããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
ããªããã£ãå¢å¹ ã¯ãããªãã®ããã©ãŒãã³ã¹äžã®å©ç¹ãæäŸããŸãããæ¬¡ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããããšãéèŠã§ãã
- ã¿ã¹ã¯ã·ã§ãŒããŒã®ãªãŒããŒããã: ã¿ã¹ã¯ã·ã§ãŒããŒã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã«ããããã®ãªãŒããŒãããã远å ããŸããå¢å¹ ä¿æ°ã決å®ããããã«å¿ èŠãªèšç®ã®ã¿ãã¿ã¹ã¯ã·ã§ãŒããŒãå®è¡ããããšã確èªããŠãã ãããã¿ã¹ã¯ã·ã§ãŒããŒã§ã®è€éãªèšç®ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããããšã®å©ç¹ãæã¡æ¶ãå¯èœæ§ããããŸãã
- ã¡ãã·ã¥ã·ã§ãŒããŒã®è€éã: ã¡ãã·ã¥ã·ã§ãŒããŒã®è€éãã¯ãããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ããŸãããžãªã¡ããªãçæããããã«å¿ èŠãªèšç®éãæå°éã«æããããã«ãã¡ãã·ã¥ã·ã§ãŒããŒã³ãŒããæé©åããŸãã
- å ±æã¡ã¢ãªã®äœ¿çš: ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãã¯ãŒã¯ã°ã«ãŒãå ã®å ±æã¡ã¢ãªã«å€§ããäŸåããŠããŸããéå°ãªå ±æã¡ã¢ãªã®äœ¿çšã¯ãåæã«å®è¡ã§ããã¯ãŒã¯ã°ã«ãŒãã®æ°ãå¶éããå¯èœæ§ããããŸããããŒã¿æ§é ãšã¢ã«ãŽãªãºã ãæ éã«æé©åããããšã§ãå ±æã¡ã¢ãªã®äœ¿çšéãæžãããŸãã
- ã¯ãŒã¯ã°ã«ãŒããµã€ãº: ã¯ãŒã¯ã°ã«ãŒããµã€ãºã¯ã䞊ååŠçã®éãšå ±æã¡ã¢ãªã®äœ¿çšã«åœ±é¿ããŸããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«æé©ãªãã©ã³ã¹ãèŠã€ããããã«ãããŸããŸãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã詊ããŠãã ããã
- ããŒã¿è»¢é: CPUãšGPUéã§è»¢éãããããŒã¿ã®éãæå°éã«æããŸããå¿ èŠãªå¶åŸ¡ããŒã¿ã®ã¿ãGPUã«éä¿¡ããããã§ãžãªã¡ããªãçæããŸãã
- ããŒããŠã§ã¢ãµããŒã: 察象ã®ããŒããŠã§ã¢ãã¡ãã·ã¥ã·ã§ãŒããŒãšããªããã£ãå¢å¹ ããµããŒãããŠããããšã確èªããŸãããŠãŒã¶ãŒã®ããã€ã¹ã§å©çšå¯èœãªWebGLãšã¯ã¹ãã³ã·ã§ã³ã確èªããŸãã
WebGLã§ã®ããªããã£ãå¢å¹ ã®å®è£
ã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããŠWebGLã§ããªããã£ãå¢å¹ ãå®è£ ããã«ã¯ãéåžžãæ¬¡ã®æé ãå«ãŸããŸãã
- ãšã¯ã¹ãã³ã·ã§ã³ã®ãµããŒãã確èªãã: å¿ èŠãªWebGLãšã¯ã¹ãã³ã·ã§ã³ïŒäŸ: `GL_NV_mesh_shader`, `GL_EXT_mesh_shader`ïŒããã©ãŠã¶ãšGPUã§ãµããŒããããŠããããšã確èªããŸããå ç¢ãªå®è£ ã§ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒãå©çšã§ããªãå Žåãé©åã«åŠçããåŸæ¥ã®ã¬ã³ããªã³ã°æè¡ã«ãã©ãŒã«ããã¯ããå¯èœæ§ããããŸãã
- ã¿ã¹ã¯ã·ã§ãŒããŒãäœæãã: å¢å¹ éãæ±ºå®ããã¿ã¹ã¯ã·ã§ãŒããŒãèšè¿°ããŸããã¿ã¹ã¯ã·ã§ãŒããŒã¯ãç®çã®è©³çŽ°åºŠãŸãã¯ãã®ä»ã®åºæºã«åºã¥ããŠãç¹å®ã®æ°ã®ã¡ãã·ã¥ã¯ãŒã¯ã°ã«ãŒãããã£ã¹ãããããå¿ èŠããããŸããã¿ã¹ã¯ã·ã§ãŒããŒã®åºåã¯ãèµ·åããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãŒã¯ã°ã«ãŒãã®æ°ãå®çŸ©ããŸãã
- ã¡ãã·ã¥ã·ã§ãŒããŒãäœæãã: é ç¹ãšããªããã£ããçæããã¡ãã·ã¥ã·ã§ãŒããŒãèšè¿°ããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãçæããããžãªã¡ããªãæ ŒçŽããããã«å ±æã¡ã¢ãªã䜿çšããå¿ èŠããããŸãã
- ããã°ã©ã ãã€ãã©ã€ã³ãäœæãã: ã¿ã¹ã¯ã·ã§ãŒããŒãã¡ãã·ã¥ã·ã§ãŒããŒããã©ã°ã¡ã³ãã·ã§ãŒããŒãçµã¿åãããããã°ã©ã ãã€ãã©ã€ã³ãäœæããŸããããã«ã¯ãåã¹ããŒãžã®åå¥ã®ã·ã§ãŒããŒãªããžã§ã¯ããäœæããããããåäžã®ããã°ã©ã ãã€ãã©ã€ã³ãªããžã§ã¯ãã«ãªã³ã¯ããããšãå«ãŸããŸãã
- ãããã¡ããã€ã³ããã: é ç¹å±æ§ãã€ã³ããã¯ã¹ããã®ä»ã®ããŒã¿ã«å¿ èŠãªãããã¡ããã€ã³ãããŸãã
- ã¡ãã·ã¥ã·ã§ãŒããŒããã£ã¹ããããã: `glDispatchMeshNVM`ãŸãã¯`glDispatchMeshEXT`颿°ã䜿çšããŠã¡ãã·ã¥ã·ã§ãŒããŒããã£ã¹ãããããŸããããã«ãããã¿ã¹ã¯ã·ã§ãŒããŒã®åºåã§æ±ºå®ããããæå®ãããæ°ã®ã¯ãŒã¯ã°ã«ãŒããèµ·åãããŸãã
- ã¬ã³ããªã³ã°ãã: `glDrawArrays`ãŸãã¯`glDrawElements`ã䜿çšããŠãçæããããžãªã¡ããªãã¬ã³ããªã³ã°ããŸãã
GLSLã³ãŒãã¹ããããã®äŸïŒäŸç€ºç - WebGLãšã¯ã¹ãã³ã·ã§ã³ãå¿ èŠïŒ:
ã¿ã¹ã¯ã·ã§ãŒããŒ:
#version 450 core
#extension GL_NV_mesh_shader : require
layout (local_size_x = 1) in;
layout (task_payload_count = 1) out;
layout (push_constant) uniform PushConstants {
int lodLevel;
} pc;
void main() {
// LODã¬ãã«ã«åºã¥ããŠãã£ã¹ãããããã¡ãã·ã¥ã¯ãŒã¯ã°ã«ãŒãã®æ°ã決å®ãã
int numWorkgroups = pc.lodLevel * pc.lodLevel;
// ãã£ã¹ãããããã¯ãŒã¯ã°ã«ãŒãã®æ°ãèšå®ãã
gl_TaskCountNV = numWorkgroups;
// ã¡ãã·ã¥ã·ã§ãŒããŒã«ããŒã¿ãæž¡ãïŒãªãã·ã§ã³ïŒ
taskPayloadNV[0].lod = pc.lodLevel;
}
ã¡ãã·ã¥ã·ã§ãŒããŒ:
#version 450 core
#extension GL_NV_mesh_shader : require
layout (local_size_x = 32) in;
layout (triangles, max_vertices = 64, max_primitives = 128) out;
layout (location = 0) out vec3 position[];
layout (location = 1) out vec3 normal[];
layout (task_payload_count = 1) in;
struct TaskPayload {
int lod;
};
shared TaskPayload taskPayload;
void main() {
taskPayload = taskPayloadNV[gl_WorkGroupID.x];
uint vertexId = gl_LocalInvocationID.x;
// ã¯ãŒã¯ã°ã«ãŒããšé ç¹IDã«åºã¥ããŠé ç¹ãšããªããã£ããçæãã
float x = float(vertexId) / float(gl_WorkGroupSize.x - 1);
float y = sin(x * 3.14159 * taskPayload.lod);
vec3 pos = vec3(x, y, 0.0);
position[vertexId] = pos;
normal[vertexId] = vec3(0.0, 0.0, 1.0);
gl_PrimitiveTriangleIndicesNV[vertexId] = vertexId;
// ãã®ã¡ãã·ã¥ã·ã§ãŒããŒã®åŒã³åºãã§çæãããé ç¹ãšããªããã£ãã®æ°ãèšå®ãã
gl_MeshVerticesNV = gl_WorkGroupSize.x;
gl_MeshPrimitivesNV = gl_WorkGroupSize.x - 2;
}
ãã©ã°ã¡ã³ãã·ã§ãŒããŒ:
#version 450 core
layout (location = 0) in vec3 normal;
layout (location = 0) out vec4 fragColor;
void main() {
fragColor = vec4(abs(normal), 1.0);
}
å¿ èŠãªãšã¯ã¹ãã³ã·ã§ã³ãããããšãåæãšããŠããã®äŸã¯äžé£ã®ãµã€ã³æ³¢ãäœæããŸãã`lodLevel`ããã·ã¥å®æ°ã¯ãäœæããããµã€ã³æ³¢ã®æ°ãå¶åŸ¡ããã¿ã¹ã¯ã·ã§ãŒããŒã¯ãããé«ãLODã¬ãã«ã«å¯ŸããŠããå€ãã®ã¡ãã·ã¥ã¯ãŒã¯ã°ã«ãŒãããã£ã¹ãããããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãåãµã€ã³æ³¢ã»ã°ã¡ã³ãã®é ç¹ãçæããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã®ä»£æ¿ææ®µïŒããã³ããããé©ããŠããªãçç±ïŒ
ã¡ãã·ã¥ã·ã§ãŒããŒãšããªããã£ãå¢å¹ ã¯å€§ããªå©ç¹ãæäŸããŸããããžãªã¡ããªçæã®ä»£æ¿æè¡ãèªèããããšãéèŠã§ãã
- ãžãªã¡ããªã·ã§ãŒããŒ: åè¿°ã®ããã«ããžãªã¡ããªã·ã§ãŒããŒã¯æ°ãããžãªã¡ããªãäœæã§ããŸãããã ãããããã¯å€ãã®å Žåããã®é 次åŠçã®æ§è³ªãåå ã§ãããã©ãŒãã³ã¹ã®ããã«ããã¯ã«æ©ãŸãããŸããé«åºŠãªäžŠååŠçãåçãžãªã¡ããªçæã«ã¯ããã»ã©é©ããŠããŸããã
- ããã»ã¬ãŒã·ã§ã³ã·ã§ãŒããŒ: ããã»ã¬ãŒã·ã§ã³ã·ã§ãŒããŒã¯ãæ¢åã®ãžãªã¡ããªã现ååãããã詳现ãªãµãŒãã§ã¹ãäœæã§ããŸãããã ããæåã®å ¥åã¡ãã·ã¥ãå¿ èŠã§ãããæ°ãããžãªã¡ããªãå®å šã«çæããã®ã§ã¯ãªããæ¢åã®ãžãªã¡ããªãæŽç·Žãããã®ã«æé©ã§ãã
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒ: ã³ã³ãã¥ãŒãã·ã§ãŒããŒã䜿çšããŠããžãªã¡ããªããŒã¿ãäºåã«èšç®ãããããã¡ã«ä¿åã§ããŸãããã®åŸãåŸæ¥ã®ã¬ã³ããªã³ã°æè¡ã䜿çšããŠã¬ã³ããªã³ã°ã§ããŸãããã®ã¢ãããŒãã¯æè»æ§ãæäŸããŸãããé ç¹ããŒã¿ã®ããã¥ã¢ã«ç®¡çãå¿ èŠã§ãããã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããŠãžãªã¡ããªãçŽæ¥çæãããããå¹çãæªãå ŽåããããŸãã
- ã€ã³ã¹ã¿ã³ã¹å: ã€ã³ã¹ã¿ã³ã¹åã«ãããåãã¡ãã·ã¥ã®è€æ°ã®ã³ããŒãç°ãªã倿ã§ã¬ã³ããªã³ã°ã§ããŸãããã ããã¡ãã·ã¥èªäœã®*ãžãªã¡ããª*ã倿Žããããšã¯ã§ããŸãããåäžã®ã€ã³ã¹ã¿ã³ã¹ã®å€æã«éå®ãããŠããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãç¹ã«ããªããã£ãå¢å¹ ã䜿çšããå Žåãåçãžãªã¡ããªçæãšãã现ããå¶åŸ¡ãæãéèŠã§ããã·ããªãªã§åªããŠããŸãããããã¯ãåŸæ¥ã®æè¡ã«ä»£ããé åçãªä»£æ¿ææ®µãæäŸããç¹ã«è€éã§ããã·ãŒãžã£ã«ã«çæãããã³ã³ãã³ããæ±ãå Žåã«åœ¹ç«ã¡ãŸãã
ãžãªã¡ããªåŠçã®å°æ¥
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãããGPUäžå¿ã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã«åããéèŠãªäžæ©ã衚ããŠããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãGPUã«ãžãªã¡ããªåŠçããªãããŒãããããšã«ãããããå¹ççã§æè»ãªã¬ã³ããªã³ã°æè¡ãå¯èœã«ããŸããã¡ãã·ã¥ã·ã§ãŒããŒã®ããŒããŠã§ã¢ãšãœãããŠã§ã¢ã®ãµããŒããåŒãç¶ãæ¹åãããããããã®ãã¯ãããžãŒã®ããã«é©æ°çãªã¢ããªã±ãŒã·ã§ã³ãèŠããããšäºæ³ã§ããŸãããžãªã¡ããªåŠçã®æªæ¥ã¯ãééããªãã¡ãã·ã¥ã·ã§ãŒããŒããã³ãã®ä»ã®GPUé§ååã¬ã³ããªã³ã°æè¡ã®é²åãšçµ¡ã¿åã£ãŠããŸãã
çµè«
WebGLã¡ãã·ã¥ã·ã§ãŒããŒããªããã£ãå¢å¹ ã¯ãåçãžãªã¡ããªçæãšæäœã®ããã®åŒ·åãªæè¡ã§ããGPUã®äžŠååŠçæ©èœã掻çšããããšã«ãããããªããã£ãå¢å¹ ã¯ããã©ãŒãã³ã¹ãšæè»æ§ãå€§å¹ ã«åäžãããããšãã§ããŸããã¡ãã·ã¥ã·ã§ãŒããŒãã€ãã©ã€ã³ããã®å©ç¹ãããã³ãã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãçè§£ããããšã¯ãWebGLã¬ã³ããªã³ã°ã®éçãæŒãåºããããšããŠããéçºè ã«ãšã£ãŠäžå¯æ¬ ã§ããWebGLãé²åããããé«åºŠãªæ©èœãçµã¿èŸŒãã«ã€ããŠãèŠäºãã€å¹ççãªWebããŒã¹ã®ã°ã©ãã£ãã¯ã¹ãšã¯ã¹ããªãšã³ã¹ãäœæããã«ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒããã¹ã¿ãŒããããšããŸããŸãéèŠã«ãªããŸããããŸããŸãªæè¡ã詊ããŠãããªããã£ãå¢å¹ ãããããå¯èœæ§ãæ¢ã£ãŠãã ãããããã©ãŒãã³ã¹ã®ãã¬ãŒããªããæ éã«æ€èšããã¿ãŒã²ããããŒããŠã§ã¢åãã«ã³ãŒããæé©åããããšãå¿ããªãã§ãã ãããèšç»ãšå®è£ ãæ³šææ·±ãè¡ãã°ãã¡ãã·ã¥ã·ã§ãŒããŒã®åãæŽ»çšããŠãæ¬åœã«æ¯ãåããããªããžã¥ã¢ã«ãäœæã§ããŸãã
ææ°ã®æ å ±ãšäœ¿çšã¬ã€ãã©ã€ã³ã«ã€ããŠã¯ãå ¬åŒã®WebGL仿§ãšæ¡åŒµæ©èœã®ããã¥ã¡ã³ããåç §ããŠãã ãããWebGLéçºè ã³ãã¥ããã£ã«åå ããŠãããªãã®çµéšãå ±æããä»ã®äººããåŠã¶ããšãæ€èšããŠãã ãããæ¥œããã³ãŒãã£ã³ã°ãïŒ