WebGLã®ã¡ã¢ãªç®¡çãæ·±ãæãäžããããã©ãŒãã³ã¹æé©åã®ããã®ã¡ã¢ãªããŒã«ã®ããã©ã°ã¡ã³ããŒã·ã§ã³æè¡ãšãããã¡ã¡ã¢ãªã®å§çž®æŠç¥ã«çŠç¹ãåœãŠãŠè§£èª¬ããŸãã
WebGLã¡ã¢ãªããŒã«ã®ããã©ã°ã¡ã³ããŒã·ã§ã³ïŒãããã¡ã¡ã¢ãªã®å§çž®
WebGLã¯ããã©ã°ã€ã³ã䜿çšããã«ãäºææ§ã®ãããŠã§ããã©ãŠã¶å ã§ã€ã³ã¿ã©ã¯ãã£ããª2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®JavaScript APIã§ãããå¹ççãªã¡ã¢ãªç®¡çã«å€§ããäŸåããŠããŸããWebGLãã©ã®ããã«ã¡ã¢ãªãç¹ã«ãããã¡ãªããžã§ã¯ããå²ãåœãŠãå©çšããããçè§£ããããšã¯ãããã©ãŒãã³ã¹ãé«ãå®å®ããã¢ããªã±ãŒã·ã§ã³ãéçºããäžã§æ¥µããŠéèŠã§ããWebGLéçºã«ãããé倧ãªèª²é¡ã®1ã€ã¯ã¡ã¢ãªã®æçåã§ãããããã¯ããã©ãŒãã³ã¹ã®äœäžãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ã«ã€ãªããå¯èœæ§ããããŸãããã®èšäºã§ã¯ãWebGLã®ã¡ã¢ãªç®¡çã®è€éããæãäžããã¡ã¢ãªããŒã«ã®ããã©ã°ã¡ã³ããŒã·ã§ã³æè¡ãç¹ã«ãããã¡ã¡ã¢ãªã®å§çž®æŠç¥ã«çŠç¹ãåœãŠãŸãã
WebGLã®ã¡ã¢ãªç®¡çãçè§£ãã
WebGLã¯ãã©ãŠã¶ã®ã¡ã¢ãªã¢ãã«ã®å¶çŽå ã§åäœããŸããã€ãŸãããã©ãŠã¶ã¯WebGLã䜿çšããããã«äžå®éã®ã¡ã¢ãªãå²ãåœãŠãŸãããã®å²ãåœãŠãããã¹ããŒã¹å ã§ãWebGLã¯ä»¥äžãå«ãããŸããŸãªãªãœãŒã¹ã®ããã«ç¬èªã®ã¡ã¢ãªããŒã«ã管çããŸãïŒ
- ãããã¡ãªããžã§ã¯ã: é ç¹ããŒã¿ãã€ã³ããã¯ã¹ããŒã¿ãããã³ã¬ã³ããªã³ã°ã§äœ¿çšããããã®ä»ã®ããŒã¿ãæ ŒçŽããŸãã
- ãã¯ã¹ãã£: ãµãŒãã§ã¹ã®ãã¯ã¹ãã£ãªã³ã°ã«äœ¿çšãããç»åããŒã¿ãæ ŒçŽããŸãã
- ã¬ã³ããŒãããã¡ãšãã¬ãŒã ãããã¡: ã¬ã³ããªã³ã°ã¿ãŒã²ãããšãªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ã管çããŸãã
- ã·ã§ãŒããŒãšããã°ã©ã : ã³ã³ãã€ã«ãããã·ã§ãŒããŒã³ãŒããæ ŒçŽããŸãã
ãããã¡ãªããžã§ã¯ãã¯ãã¬ã³ããªã³ã°ããããªããžã§ã¯ããå®çŸ©ãããžãªã¡ããªããŒã¿ãä¿æãããããç¹ã«éèŠã§ãããããã¡ãªããžã§ã¯ãã®ã¡ã¢ãªãå¹ççã«ç®¡çããããšã¯ãã¹ã ãŒãºã§å¿çæ§ã®é«ãWebGLã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠæãéèŠã§ããéå¹ççãªã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã®ãã¿ãŒã³ã¯ãã¡ã¢ãªã®æçåã«ã€ãªããå¯èœæ§ããããŸããããã¯ãå©çšå¯èœãªã¡ã¢ãªãå°ãããé£ç¶ããŠããªããããã¯ã«åå²ãããç¶æ ã§ããããã«ãããããšã空ãã¡ã¢ãªã®åèšéãååã§ãã£ãŠããå¿ èŠã«å¿ããŠå€§ããªé£ç¶ããã¡ã¢ãªãããã¯ãå²ãåœãŠãããšãå°é£ã«ãªããŸãã
ã¡ã¢ãªæçåã®åé¡
ã¡ã¢ãªã®æçåã¯ãå°ããªã¡ã¢ãªãããã¯ãæéãšãšãã«å²ãåœãŠããããè§£æŸããããããããšã§ãå²ãåœãŠããããããã¯éã«ééãæ®ãå Žåã«çºçããŸããæ¬æ£ã«ããŸããŸãªãµã€ãºã®æ¬ãç¶ç¶çã«è¿œå ãããåé€ãããããã®ãæ³åããŠã¿ãŠãã ãããæçµçã«ã¯ã倧ããªæ¬ãåããã®ã«ååãªç©ºãã¹ããŒã¹ããããããããŸãããããã®ã¹ããŒã¹ã¯å°ããªééã«æ£ãã°ã£ãŠãããããæ¬ã眮ãããšãã§ããŸããã
WebGLã§ã¯ãããã¯ä»¥äžã®ãããªåé¡ã«ã€ãªãããŸãïŒ
- å²ãåœãŠæéã®é å»¶ïŒã·ã¹ãã ã¯é©åãªç©ºããããã¯ãæ€çŽ¢ããå¿ èŠããããæéããããããšããããŸãã
- å²ãåœãŠã®å€±æïŒåèšã¡ã¢ãªãååã«ãã£ãŠããã¡ã¢ãªãæçåããŠããããã«å€§ããªé£ç¶ãããã¯ã®ãªã¯ãšã¹ãã倱æããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®äœäžïŒé »ç¹ãªã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãªãŒããŒããããå¢å ãããå šäœçãªããã©ãŒãã³ã¹ãäœäžãããŸãã
ã¡ã¢ãªæçåã®åœ±é¿ã¯ãåçãªã·ãŒã³ãé »ç¹ãªããŒã¿æŽæ°ïŒäŸïŒãªã¢ã«ã¿ã€ã ã·ãã¥ã¬ãŒã·ã§ã³ãã²ãŒã ïŒãããã³å€§èŠæš¡ãªããŒã¿ã»ããïŒäŸïŒç¹çŸ€ãè€éãªã¡ãã·ã¥ïŒãæ±ãã¢ããªã±ãŒã·ã§ã³ã§å¢å¹ ãããŸããäŸãã°ãã¿ã³ãã¯è³ªã®åçãª3Dã¢ãã«ã衚瀺ããç§åŠçãªå¯èŠåã¢ããªã±ãŒã·ã§ã³ã§ã¯ãåºç€ãšãªãé ç¹ããŒã¿ãçµ¶ããæŽæ°ããããããã¡ã¢ãªã®æçåãçºçããæ·±å»ãªããã©ãŒãã³ã¹äœäžãçµéšããå¯èœæ§ããããŸãã
ã¡ã¢ãªããŒã«ã®ããã©ã°ã¡ã³ããŒã·ã§ã³æè¡
ããã©ã°ã¡ã³ããŒã·ã§ã³ã¯ãæçåããã¡ã¢ãªãããã¯ããã倧ããé£ç¶ãããããã¯ã«çµ±åããããšãç®çãšããŠããŸããWebGLã§ãããéæããããã«ãããã€ãã®æè¡ãæ¡çšã§ããŸãïŒ
1. ãµã€ãºå€æŽã䌎ãéçã¡ã¢ãªå²ãåœãŠ
åžžã«ã¡ã¢ãªãå²ãåœãŠããè§£æŸãããããã®ã§ã¯ãªããæåã«å€§ããªãããã¡ãªããžã§ã¯ããäºåã«å²ãåœãŠãå¿ èŠã«å¿ããŠ`gl.bufferData`ã䜿çšããŠ`gl.DYNAMIC_DRAW`ã®äœ¿çšãã³ããä»ããŠãµã€ãºã倿ŽããŸããããã«ãããã¡ã¢ãªå²ãåœãŠã®é »åºŠã¯æå°éã«æããããŸããããããã¡å ã®ããŒã¿ã®æ éãªç®¡çãå¿ èŠã§ãã
äŸïŒ
// 劥åœãªåæãµã€ãºã§åæå
let bufferSize = 1024 * 1024; // 1MB
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, bufferSize, gl.DYNAMIC_DRAW);
// åŸã§ããå€ãã®ã¹ããŒã¹ãå¿
èŠã«ãªã£ãå Žå
if (newSize > bufferSize) {
bufferSize = newSize * 2; // é »ç¹ãªãµã€ãºå€æŽãé¿ããããã«ãµã€ãºã2åã«ãã
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, bufferSize, gl.DYNAMIC_DRAW);
}
// æ°ããããŒã¿ã§ãããã¡ãæŽæ°
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferSubData(gl.ARRAY_BUFFER, 0, newData);
é·æïŒ å²ãåœãŠã®ãªãŒããŒããããåæžããŸãã
çæïŒ ãããã¡ãµã€ãºãšããŒã¿ãªãã»ããã®æå管çãå¿ èŠã§ããé »ç¹ã«è¡ããšããããã¡ã®ãµã€ãºå€æŽã¯äŸç¶ãšããŠé«ã³ã¹ãã«ãªãå¯èœæ§ããããŸãã
2. ã«ã¹ã¿ã ã¡ã¢ãªã¢ãã±ãŒã¿
WebGLãããã¡ã®äžã«ã«ã¹ã¿ã ã¡ã¢ãªã¢ãã±ãŒã¿ãå®è£ ããŸããããã«ã¯ããããã¡ãããå°ããªãããã¯ã«åå²ãããªã³ã¯ãªã¹ããããªãŒãªã©ã®ããŒã¿æ§é ã䜿çšããŠç®¡çããããšãå«ãŸããŸããã¡ã¢ãªãèŠæ±ããããšãã¢ãã±ãŒã¿ã¯é©åãªç©ºããããã¯ãèŠã€ããŠãã®ãã€ã³ã¿ãè¿ããŸããã¡ã¢ãªãè§£æŸããããšãã¢ãã±ãŒã¿ã¯ãã®ãããã¯ã空ããšããŠããŒã¯ãã飿¥ãã空ããããã¯ãšçµåããå¯èœæ§ããããŸãã
äŸïŒ åçŽãªå®è£ ã§ã¯ããã倧ããªå²ãåœãŠæžã¿WebGLãããã¡å ã®å©çšå¯èœãªã¡ã¢ãªãããã¯ã远跡ããããã«ããªãŒãªã¹ãã䜿çšã§ããŸããæ°ãããªããžã§ã¯ãããããã¡ã¹ããŒã¹ãå¿ èŠãšãããšããã«ã¹ã¿ã ã¢ãã±ãŒã¿ã¯ããªãŒãªã¹ããæ€çŽ¢ããŠååãªå€§ããã®ãããã¯ãæ¢ããŸããé©åãªãããã¯ãèŠã€ãã£ãå Žåãããã¯ïŒå¿ èŠã«å¿ããŠïŒåå²ãããå¿ èŠãªéšåãå²ãåœãŠãããŸãããªããžã§ã¯ããç Žæ£ããããšãããã«é¢é£ä»ãããããããã¡ã¹ããŒã¹ã¯ããªãŒãªã¹ãã«æ»ããã飿¥ãã空ããããã¯ãšçµåããŠãã倧ããªé£ç¶é åãäœæããå¯èœæ§ããããŸãã
é·æïŒ ã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã«å¯Ÿãããã现ããå¶åŸ¡ãå¯èœã§ããã¡ã¢ãªäœ¿çšçãåäžããå¯èœæ§ããããŸãã
çæïŒ å®è£ ãšä¿å®ãããè€éã§ããç«¶åç¶æ ãé¿ããããã«æ éãªåæãå¿ èŠã§ãã
3. ãªããžã§ã¯ãããŒãªã³ã°
é¡äŒŒã®ãªããžã§ã¯ããé »ç¹ã«äœæããã³ç Žæ£ããŠããå Žåããªããžã§ã¯ãããŒãªã³ã°ã¯æçãªæè¡ãšãªãåŸãŸãããªããžã§ã¯ããç Žæ£ãã代ããã«ãå©çšå¯èœãªãªããžã§ã¯ãã®ããŒã«ã«æ»ããŸããæ°ãããªããžã§ã¯ããå¿ èŠãªå Žåã¯ãæ°ãããã®ãäœæãã代ããã«ããŒã«ãã1ã€åããŸããããã«ãããã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã®åæ°ãæžå°ããŸãã
äŸïŒ ããŒãã£ã¯ã«ã·ã¹ãã ã§ã¯ããã¬ãŒã ããšã«æ°ããããŒãã£ã¯ã«ãªããžã§ã¯ããäœæãã代ããã«ãæåã«ããŒãã£ã¯ã«ãªããžã§ã¯ãã®ããŒã«ãäœæããŸããæ°ããããŒãã£ã¯ã«ãå¿ èŠã«ãªã£ãããããŒã«ãã1ã€åãåºããŠåæåããŸããããŒãã£ã¯ã«ãæ¶æ» ããããç Žæ£ããã®ã§ã¯ãªãããŒã«ã«æ»ããŸãã
é·æïŒ å²ãåœãŠãšè§£æŸã®ãªãŒããŒããããå€§å¹ ã«åæžããŸãã
çæïŒ é »ç¹ã«äœæã»ç Žæ£ãããé¡äŒŒã®ããããã£ãæã€ãªããžã§ã¯ãã«ã®ã¿é©ããŠããŸãã
ãããã¡ã¡ã¢ãªã®å§çž®
ãããã¡ã¡ã¢ãªã®å§çž®ã¯ããããã¡å ã®å²ãåœãŠæžã¿ã¡ã¢ãªãããã¯ãç§»åãããŠããã倧ããªé£ç¶ãã空ããããã¯ãäœæããç¹å®ã®ããã©ã°ã¡ã³ããŒã·ã§ã³æè¡ã§ããããã¯ãæ¬æ£ã®æ¬ãåé 眮ããŠããã¹ãŠã®ç©ºãã¹ããŒã¹ããŸãšããããšã«äŒŒãŠããŸãã
å®è£ æŠç¥
以äžã«ããããã¡ã¡ã¢ãªå§çž®ã®å®è£ æ¹æ³ã®å èš³ã瀺ããŸãïŒ
- 空ããããã¯ã®ç¹å®ïŒ ãããã¡å ã®ç©ºããããã¯ã®ãªã¹ããç¶æããŸããããã¯ãã«ã¹ã¿ã ã¡ã¢ãªã¢ãã±ãŒã¿ã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãããªãŒãªã¹ãã䜿çšããŠè¡ãããšãã§ããŸãã
- å§çž®æŠç¥ã®æ±ºå®ïŒ å²ãåœãŠæžã¿ãããã¯ãç§»åããããã®æŠç¥ãéžæããŸããäžè¬çãªæŠç¥ã«ã¯æ¬¡ã®ãã®ããããŸãïŒ
- å é ãžã®ç§»åïŒ ãã¹ãŠã®å²ãåœãŠæžã¿ãããã¯ããããã¡ã®å é ã«ç§»åããæåŸã«åäžã®å€§ããªç©ºããããã¯ãæ®ããŸãã
- ã®ã£ãããåããããã®ç§»åïŒ å²ãåœãŠæžã¿ãããã¯ãç§»åããŠãä»ã®å²ãåœãŠæžã¿ãããã¯éã®ã®ã£ãããåããŸãã
- ããŒã¿ã®ã³ããŒïŒ `gl.bufferSubData`ã䜿çšããŠãåå²ãåœãŠæžã¿ãããã¯ãããããã¡å ã®æ°ããå Žæã«ããŒã¿ãã³ããŒããŸãã
- ãã€ã³ã¿ã®æŽæ°ïŒ ç§»åããããŒã¿ãåç §ãããã€ã³ã¿ãã€ã³ããã¯ã¹ãæŽæ°ããŠããããã¡å ã®æ°ããå Žæãåæ ãããŸããããã¯ã誀ã£ããã€ã³ã¿ãã¬ã³ããªã³ã°ãšã©ãŒã«ã€ãªãããããéåžžã«éèŠãªã¹ãããã§ãã
äŸïŒå é ãžã®ç§»åã«ããå§çž®
ãå é ãžã®ç§»åãæŠç¥ããç°¡ç¥åãããäŸã§èª¬æããŸãããã3ã€ã®å²ãåœãŠæžã¿ãããã¯ïŒAãBãCïŒãš2ã€ã®ç©ºããããã¯ïŒF1ãF2ïŒãéã«æ£åšããŠãããããã¡ããããšããŸãïŒ
[A] [F1] [B] [F2] [C]
å§çž®åŸããããã¡ã¯æ¬¡ã®ããã«ãªããŸãïŒ
[A] [B] [C] [F1+F2]
以äžã«ããã®ããã»ã¹ã®ç䌌ã³ãŒãã瀺ããŸãïŒ
function compactBuffer(buffer, blockInfo) {
// blockInfoã¯ãªããžã§ã¯ãã®é
åã§ãåãªããžã§ã¯ãã¯ä»¥äžãå«ã¿ãŸãïŒ{offset: number, size: number, userData: any}
// userDataã¯ããããã¯ã«é¢é£ä»ããããé ç¹æ°ãªã©ã®æ
å ±ãä¿æã§ããŸãã
let currentOffset = 0;
for (const block of blockInfo) {
if (!block.free) {
// å€ãå ŽæããããŒã¿ãèªã¿èŸŒã
const data = new Uint8Array(block.size); // ãã€ãããŒã¿ãšä»®å®
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.getBufferSubData(gl.ARRAY_BUFFER, block.offset, data);
// æ°ããå Žæã«ããŒã¿ãæžã蟌ã
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferSubData(gl.ARRAY_BUFFER, currentOffset, data);
// ãããã¯æ
å ±ãæŽæ°ïŒå°æ¥ã®ã¬ã³ããªã³ã°ã«éèŠïŒ
block.newOffset = currentOffset;
currentOffset += block.size;
}
}
// æ°ãããªãã»ãããåæ ããããã«blockInfoé
åãæŽæ°
for (const block of blockInfo) {
block.offset = block.newOffset;
delete block.newOffset;
}
}
éèŠãªèæ ®äºé ïŒ
- ããŒã¿åïŒ äŸã®`Uint8Array`ã¯ãã€ãããŒã¿ãæ³å®ããŠããŸãããããã¡ã«æ ŒçŽãããŠããå®éã®ããŒã¿ã«å¿ããŠããŒã¿åã調æŽããŠãã ããïŒäŸïŒé ç¹äœçœ®ã®å Žåã¯`Float32Array`ïŒã
- åæïŒ ãããã¡ã®å§çž®äžã«WebGLã³ã³ããã¹ããã¬ã³ããªã³ã°ã«äœ¿çšãããŠããªãããšã確èªããŠãã ãããããã¯ãããã«ãããã¡ãªã³ã°ã¢ãããŒãã䜿çšããããå§çž®ããã»ã¹äžã«ã¬ã³ããªã³ã°ãäžæåæ¢ããããšã§å®çŸã§ããŸãã
- ãã€ã³ã¿ã®æŽæ°ïŒ ãããã¡å ã®ããŒã¿ãåç §ããã€ã³ããã¯ã¹ããªãã»ãããæŽæ°ããŠãã ãããããã¯æ£ããã¬ã³ããªã³ã°ã«äžå¯æ¬ ã§ããã€ã³ããã¯ã¹ãããã¡ã䜿çšããŠããå Žåã¯ãæ°ããé ç¹äœçœ®ãåæ ããããã«ã€ã³ããã¯ã¹ãæŽæ°ããå¿ èŠããããŸãã
- ããã©ãŒãã³ã¹ïŒ ãããã¡ã®å§çž®ã¯ãç¹ã«å€§ããªãããã¡ã®å Žåãé«ã³ã¹ããªæäœã«ãªãå¯èœæ§ããããŸããæ§ããã«ãå¿ èŠãªå Žåã«ã®ã¿å®è¡ããå¿ èŠããããŸãã
å§çž®ããã©ãŒãã³ã¹ã®æé©å
ãããã¡ã¡ã¢ãªå§çž®ã®ããã©ãŒãã³ã¹ãæé©åããããã«ãããã€ãã®æŠç¥ã䜿çšã§ããŸãïŒ
- ããŒã¿ã³ããŒã®æå°åïŒ ã³ããŒããå¿ èŠãããããŒã¿ã®éãæå°éã«æããããã«ããŠãã ãããããã¯ãããŒã¿ãç§»åããå¿ èŠãããè·é¢ãæå°åããå§çž®æŠç¥ã䜿çšããããæçåãæ¿ãããããã¡ã®é åã®ã¿ãå§çž®ããããšã§å®çŸã§ããŸãã
- éåæè»¢éã®äœ¿çšïŒ å¯èœã§ããã°ãéåæããŒã¿è»¢éã䜿çšããŠãå§çž®ããã»ã¹äžã«ã¡ã€ã³ã¹ã¬ããããããã¯ããªãããã«ããŸããããã¯Web Workerã䜿çšããŠè¡ãããšãã§ããŸãã
- ãããæäœïŒ åãããã¯ã«å¯ŸããŠåå¥ã®`gl.bufferSubData`åŒã³åºããå®è¡ãã代ããã«ããããããã倧ããªè»¢éã«ãŸãšããŸãã
ããã©ã°ãŸãã¯å§çž®ãè¡ãã¿ã€ãã³ã°
ããã©ã°ã¡ã³ããŒã·ã§ã³ãšå§çž®ã¯åžžã«å¿ èŠãšããããã§ã¯ãããŸããããããã®æäœãå®è¡ãããã©ãããæ±ºå®ããéã«ã¯ã次ã®èŠå ãèæ ®ããŠãã ããïŒ
- æçåã¬ãã«ïŒ ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªæçåã¬ãã«ãç£èŠããŸããæçåãäœãå Žåã¯ãããã©ã°ããå¿ èŠã¯ãªããããããŸãããã¡ã¢ãªäœ¿çšéãšæçåã¬ãã«ã远跡ããããã®èšºæããŒã«ãå®è£ ããŠãã ããã
- å²ãåœãŠå€±æçïŒ æçåãåå ã§ã¡ã¢ãªå²ãåœãŠãé »ç¹ã«å€±æããå Žåã¯ãããã©ã°ãå¿ èŠã«ãªãããšããããŸãã
- ããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒ ããã©ã°ã¡ã³ããŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã枬å®ããŸããããã©ã°ã®ã³ã¹ããå©ç¹ãäžåãå Žåã¯ã䟡å€ããªããããããŸããã
- ã¢ããªã±ãŒã·ã§ã³ã®çš®é¡ïŒ åçãªã·ãŒã³ãšé »ç¹ãªããŒã¿æŽæ°ã䌎ãã¢ããªã±ãŒã·ã§ã³ã¯ãéçãªã¢ããªã±ãŒã·ã§ã³ãããããã©ã°ã®æ©æµãåããå¯èœæ§ãé«ãã§ãã
çµéšåãšããŠãæçåã¬ãã«ãç¹å®ã®ãããå€ãè¶ ãããšãããŸãã¯ã¡ã¢ãªå²ãåœãŠã®å€±æãé »ç¹ã«ãªã£ããšãã«ããã©ã°ã¡ã³ããŒã·ã§ã³ãŸãã¯å§çž®ãããªã¬ãŒããã®ãè¯ãã§ãããã芳枬ãããã¡ã¢ãªäœ¿çšãã¿ãŒã³ã«åºã¥ããŠããã©ã°ã®é »åºŠãåçã«èª¿æŽããã·ã¹ãã ãå®è£ ããŠãã ããã
äŸïŒå®äžçã®ã·ããªãª - åçãªå°åœ¢çæ
åçã«å°åœ¢ãçæããã²ãŒã ãã·ãã¥ã¬ãŒã·ã§ã³ãèããŠã¿ãŸãããããã¬ã€ã€ãŒãäžçãæ¢çŽ¢ããã«ã€ããŠãæ°ããå°åœ¢ãã£ã³ã¯ãäœæãããå€ããã£ã³ã¯ãç Žæ£ãããŸããããã«ãããæéãšãšãã«é倧ãªã¡ã¢ãªã®æçåãçºçããå¯èœæ§ããããŸãã
ãã®ã·ããªãªã§ã¯ããããã¡ã¡ã¢ãªå§çž®ã䜿çšããŠãå°åœ¢ãã£ã³ã¯ã«ãã£ãŠäœ¿çšãããã¡ã¢ãªãçµ±åã§ããŸããç¹å®ã®æçåã¬ãã«ã«éãããšãå°åœ¢ããŒã¿ãããå°æ°ã®å€§ããªãããã¡ã«å§çž®ããå²ãåœãŠããã©ãŒãã³ã¹ãåäžãããã¡ã¢ãªå²ãåœãŠã®å€±æã®ãªã¹ã¯ãäœæžã§ããŸãã
å ·äœçã«ã¯ã次ã®ãããªããšãè¡ããããããŸããïŒ
- å°åœ¢ãããã¡å ã®å©çšå¯èœãªã¡ã¢ãªãããã¯ã远跡ããŸãã
- æçåçããããå€ïŒäŸïŒ70ïŒ ïŒãè¶ ããããå§çž®ããã»ã¹ãéå§ããŸãã
- ã¢ã¯ãã£ããªå°åœ¢ãã£ã³ã¯ã®é ç¹ããŒã¿ããæ°ããé£ç¶ãããããã¡é åã«ã³ããŒããŸãã
- æ°ãããããã¡ãªãã»ãããåæ ããããã«ãé ç¹å±æ§ãã€ã³ã¿ãæŽæ°ããŸãã
ã¡ã¢ãªåé¡ã®ãããã°
WebGLã§ã®ã¡ã¢ãªåé¡ã®ãããã°ã¯å°é£ãªå ŽåããããŸãã以äžã«ããã€ãã®ãã³ãã瀺ããŸãïŒ
- WebGL InspectorïŒ WebGLã€ã³ã¹ãã¯ã¿ããŒã«ïŒäŸïŒSpector.jsïŒã䜿çšããŠããããã¡ãªããžã§ã¯ãããã¯ã¹ãã£ãã·ã§ãŒããŒãªã©ãWebGLã³ã³ããã¹ãã®ç¶æ ã調ã¹ãŸããããã¯ãã¡ã¢ãªãªãŒã¯ãéå¹ççãªã¡ã¢ãªäœ¿çšãã¿ãŒã³ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- ãã©ãŠã¶éçºè ããŒã«ïŒ ãã©ãŠã¶ã®éçºè ããŒã«ã䜿çšããŠã¡ã¢ãªäœ¿çšéãç£èŠããŸããéå°ãªã¡ã¢ãªæ¶è²»ãã¡ã¢ãªãªãŒã¯ãæ¢ããŠãã ããã
- ãšã©ãŒãã³ããªã³ã°ïŒ ã¡ã¢ãªå²ãåœãŠã®å€±æããã®ä»ã®WebGLãšã©ãŒããã£ããããããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸããWebGL颿°ã®æ»ãå€ã確èªãããšã©ãŒãã³ã³ãœãŒã«ã«èšé²ããŠãã ããã
- ãããã¡ã€ãªã³ã°ïŒ ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
WebGLã¡ã¢ãªç®¡çã®ãã¹ããã©ã¯ãã£ã¹
以äžã«ãWebGLã¡ã¢ãªç®¡çã«é¢ããäžè¬çãªãã¹ããã©ã¯ãã£ã¹ãããã€ã瀺ããŸãïŒ
- ã¡ã¢ãªå²ãåœãŠã®æå°åïŒ äžèŠãªã¡ã¢ãªã®å²ãåœãŠãšè§£æŸãé¿ããŠãã ãããå¯èœãªéããªããžã§ã¯ãããŒãªã³ã°ãŸãã¯éçã¡ã¢ãªå²ãåœãŠã䜿çšããŠãã ããã
- ãããã¡ãšãã¯ã¹ãã£ã®åå©çšïŒ æ°ãããã®ãäœæãã代ããã«ãæ¢åã®ãããã¡ãšãã¯ã¹ãã£ãåå©çšããŠãã ããã
- ãªãœãŒã¹ã®è§£æŸïŒ äžèŠã«ãªã£ãWebGLãªãœãŒã¹ïŒãããã¡ããã¯ã¹ãã£ãã·ã§ãŒããŒãªã©ïŒãè§£æŸããŠãã ããã`gl.deleteBuffer`ã`gl.deleteTexture`ã`gl.deleteShader`ãããã³`gl.deleteProgram`ã䜿çšããŠãé¢é£ããã¡ã¢ãªãè§£æŸããŸãã
- é©åãªããŒã¿åã®äœ¿çšïŒ ããŒãºã«ååãªæå°ã®ããŒã¿åã䜿çšããŠãã ãããäŸãã°ãå¯èœã§ããã°`Float64Array`ã®ä»£ããã«`Float32Array`ã䜿çšããŸãã
- ããŒã¿æ§é ã®æé©åïŒ ã¡ã¢ãªæ¶è²»ãšæçåãæå°éã«æããããŒã¿æ§é ãéžæããŠãã ãããäŸãã°ãå屿§ã«åå¥ã®é åã䜿çšãã代ããã«ãã€ã³ã¿ãŒãªãŒããããé ç¹å±æ§ã䜿çšããŸãã
- ã¡ã¢ãªäœ¿çšéã®ç£èŠïŒ ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäœ¿çšéãç£èŠããæœåšçãªã¡ã¢ãªãªãŒã¯ãéå¹ççãªã¡ã¢ãªäœ¿çšãã¿ãŒã³ãç¹å®ããŠãã ããã
- å€éšã©ã€ãã©ãªã®äœ¿çšãæ€èšïŒ Babylon.jsãThree.jsãªã©ã®ã©ã€ãã©ãªã¯ãéçºããã»ã¹ãç°¡çŽ åããããã©ãŒãã³ã¹ãåäžãããããšãã§ããçµã¿èŸŒã¿ã®ã¡ã¢ãªç®¡çæŠç¥ãæäŸããŸãã
WebGLã¡ã¢ãªç®¡çã®æªæ¥
WebGLãšã³ã·ã¹ãã ã¯çµ¶ããé²åããŠãããã¡ã¢ãªç®¡çãæ¹åããããã®æ°ããæ©èœãæè¡ãéçºãããŠããŸããå°æ¥ã®ãã¬ã³ãã«ã¯æ¬¡ã®ãã®ããããŸãïŒ
- WebGL 2.0ïŒ WebGL 2.0ã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ããŠããã©ãŒã ãããã¡ãªããžã§ã¯ããªã©ãããé«åºŠãªã¡ã¢ãªç®¡çæ©èœãæäŸããããã©ãŒãã³ã¹ãåäžãããã¡ã¢ãªæ¶è²»ãåæžã§ããŸãã
- WebAssemblyïŒ WebAssemblyã䜿çšãããšãéçºè ã¯C++ãRustãªã©ã®èšèªã§ã³ãŒããèšè¿°ãããã©ãŠã¶ã§å®è¡ã§ããäœã¬ãã«ã®ãã€ãã³ãŒãã«ã³ã³ãã€ã«ã§ããŸããããã«ãããã¡ã¢ãªç®¡çã«å¯Ÿããããå€ãã®å¶åŸ¡ãå¯èœã«ãªããããã©ãŒãã³ã¹ãåäžããŸãã
- èªåã¡ã¢ãªç®¡çïŒ ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãåç §ã«ãŠã³ããªã©ãWebGLã®èªåã¡ã¢ãªç®¡çæè¡ã«é¢ããç ç©¶ãé²è¡äžã§ãã
çµè«
å¹ççãªWebGLã®ã¡ã¢ãªç®¡çã¯ãããã©ãŒãã³ã¹ãé«ãå®å®ãããŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äžå¯æ¬ ã§ããã¡ã¢ãªã®æçåã¯ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå²ãåœãŠã®å€±æããã¬ãŒã ã¬ãŒãã®äœäžã«ã€ãªããå¯èœæ§ããããŸããã¡ã¢ãªããŒã«ãããã©ã°ãããããã¡ã¡ã¢ãªãå§çž®ããæè¡ãçè§£ããããšã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ãæé©åããããã«æ¥µããŠéèŠã§ããéçã¡ã¢ãªå²ãåœãŠãã«ã¹ã¿ã ã¡ã¢ãªã¢ãã±ãŒã¿ããªããžã§ã¯ãããŒãªã³ã°ããããã¡ã¡ã¢ãªå§çž®ãªã©ã®æŠç¥ãæ¡çšããããšã§ãéçºè ã¯ã¡ã¢ãªæçåã®åœ±é¿ã軜æžããã¹ã ãŒãºã§å¿çæ§ã®é«ãã¬ã³ããªã³ã°ã確ä¿ã§ããŸããã¡ã¢ãªäœ¿çšéãç¶ç¶çã«ç£èŠããããã©ãŒãã³ã¹ããããã¡ã€ãªã³ã°ããææ°ã®WebGLéçºã«ã€ããŠåžžã«æ å ±ãåŸãããšããæåããWebGLéçºã®éµãšãªããŸãã
ãããã®ãã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšã§ãWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããäžçäžã®ãŠãŒã¶ãŒã«é åçãªããžã¥ã¢ã«äœéšãæäŸããããšãã§ããŸãã