WebGLãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®åãæ¢æ±ã髿§èœã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã®ããã®æé©åæè¡ãšé ç¹ãã£ããã£åŒ·åã«é¢ããå æ¬çã¬ã€ãã§ãã
WebGLãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯æé©åãšã³ãžã³ïŒé ç¹ãã£ããã£ã®åŒ·å
WebGLã®ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãé ç¹ã·ã§ãŒããŒã®åºåããã£ããã£ããåŸç¶ã®ã¬ã³ããªã³ã°ãã¹ã§åå©çšã§ãã匷åãªã¡ã«ããºã ã§ãããã®æè¡ã«ãããè€éãªã·ãã¥ã¬ãŒã·ã§ã³ãããŒãã£ã¯ã«ã·ã¹ãã ãé«åºŠãªã¬ã³ããªã³ã°ãšãã§ã¯ããªã©ãå¹ åºãå¯èœæ§ãåºãããŸãããããããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã§æé©ãªããã©ãŒãã³ã¹ãéæããã«ã¯ããã®å éšåäœã®æ·±ãçè§£ãšæ éãªæé©åæŠç¥ãå¿ èŠã§ãããã®èšäºã§ã¯ãWebGLãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®è€éããæãäžããããã©ãŒãã³ã¹ãšèŠèŠçå¿ å®åºŠãåäžãããããã®æé©åæè¡ãšé ç¹ãã£ããã£ã®åŒ·åã«çŠç¹ãåœãŠãŸãã
WebGLãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®çè§£
ãã®æ žå¿ã«ãããŠããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯é ç¹ã·ã§ãŒããŒã®åºåããããã¡ãªããžã§ã¯ãã«æ»ãããšãå¯èœã«ããŸãã倿ãããé ç¹ãçŽæ¥ã¬ã³ããªã³ã°ãã代ããã«ããã®å±æ§ïŒäœçœ®ãæ³ç·ããã¯ã¹ãã£åº§æšãªã©ïŒããã£ããã£ãããããã¡ã«æ ŒçŽããŸãããã®ãããã¡ã¯æ¬¡ã®ã¬ã³ããªã³ã°ãã¹ã®å ¥åãšããŠäœ¿çšã§ããå埩ããã»ã¹ãè€éãªãšãã§ã¯ããå®çŸããŸãã
äž»èŠãªæŠå¿µ
- é ç¹ã·ã§ãŒããŒ: ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®åææ®µéã§ãé ç¹å±æ§ã倿ãããå Žæã§ãã
- ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãããã¡: é ç¹ã·ã§ãŒããŒãããã£ããã£ãããé ç¹å±æ§ãæ ŒçŽãããããã¡ãªããžã§ã¯ãã§ãã
- Varying倿°: ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®åºåãšããŠæå®ãããé ç¹ã·ã§ãŒããŒå ã®å€æ°ã§ãã
- ã¯ãšãªãªããžã§ã¯ã: ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãããã¡ã«æžã蟌ãŸããããªããã£ãã®æ°ã決å®ããããã«äœ¿çšãããŸãã
åºæ¬çãªå®è£
以äžã¯ãWebGLã§ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã䜿çšããåºæ¬çãªæé ã§ãïŒ
- ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãªããžã§ã¯ãã®äœæãšãã€ã³ã:
const transformFeedback = gl.createTransformFeedback(); gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, transformFeedback);
- ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯åºåçšã®ãããã¡ãªããžã§ã¯ãã®äœæãšãã€ã³ã:
const buffer = gl.createBuffer(); gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER, buffer); gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, sizeInBytes, gl.DYNAMIC_COPY);
- é ç¹ã·ã§ãŒããŒã§ãã£ããã£ããVarying倿°ãæå®: ããã¯ããã°ã©ã ããªã³ã¯ããéã«
gl.transformFeedbackVaryings(program, varyings, bufferMode);
ã䜿çšããŠè¡ããŸããããã§varyings
ã¯Varying倿°åã衚ãæååã®é åã§ãbufferMode
ã¯gl.INTERLEAVED_ATTRIBS
ãŸãã¯gl.SEPARATE_ATTRIBS
ã®ããããã§ãã - ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®éå§ãšçµäº:
gl.beginTransformFeedback(primitiveMode);
gl.drawArrays(...);
// ãŸã㯠gl.drawElements(...)gl.endTransformFeedback();
- ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãªããžã§ã¯ãã®ã¢ã³ãã€ã³ã:
gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);
WebGLãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®æé©åæè¡
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯åŒ·åãªããŒã«ã§ãããæ£ãã䜿çšããªããšããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã以äžã®æé©åæè¡ã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯å®è£ ã®å¹çãåäžãããã®ã«åœ¹ç«ã¡ãŸãã
1. ããŒã¿è»¢éã®æå°å
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®äž»ãªããã©ãŒãã³ã¹ãªãŒããŒãããã¯ãGPUãšã¡ã¢ãªéã®ããŒã¿è»¢éã«ãããŸãã転éãããããŒã¿éãæžããããšã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
- Varying倿°ã®æ°ãæžãã: å¿ èŠãªé ç¹å±æ§ã®ã¿ããã£ããã£ããŸããäžèŠãªããŒã¿ã®ãã£ããã£ã¯é¿ããŠãã ãããäŸãã°ã次ã®ãã¹ã§äœçœ®æ å ±ã®ã¿ãå¿ èŠãªå Žåã¯ãæ³ç·ããã¯ã¹ãã£åº§æšããã£ããã£ããªãã§ãã ããã
- ããå°ããããŒã¿åã䜿çšãã: é ç¹å±æ§ãæ£ç¢ºã«è¡šçŸã§ããæå°ã®ããŒã¿åãéžæããŸããäŸãã°ãäœåãªç²ŸåºŠãäžèŠãªå Žåã¯
double
ã®ä»£ããã«float
ã䜿çšããŸããããŒããŠã§ã¢ããµããŒãããŠããå Žåã¯ãç¹ã«éèŠåºŠã®äœã屿§ã«å¯ŸããŠå粟床浮åå°æ°ç¹æ°ïŒmediump
ïŒã®äœ¿çšãæ€èšããŠãã ããããã ãã粟床ã®åé¡ãçºçããå¯èœæ§ã«æ³šæããŠãã ããã - ã€ã³ã¿ãŒãªãŒã屿§ãšã»ãã¬ãŒã屿§:
gl.INTERLEAVED_ATTRIBS
ã¯ãããã¡ã®ãã€ã³ãåæ°ãæžãããããå Žåã«ãã£ãŠã¯ããå¹ççã§ããããããåŸã®ãã¹ã§ç¹å®ã®å±æ§ã®ã¿ãæŽæ°ããå¿ èŠãããå Žåã¯ãgl.SEPARATE_ATTRIBS
ã®æ¹ãæè»æ§ãé«ãå ŽåããããŸããäž¡æ¹ã®ãªãã·ã§ã³ããããã¡ã€ã«ããŠãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æé©ãªã¢ãããŒããæ±ºå®ããŠãã ããã
2. ã·ã§ãŒããŒããã©ãŒãã³ã¹ã®æé©å
é ç¹ã·ã§ãŒããŒã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ããã»ã¹ã®äžå¿ã§ããã·ã§ãŒããŒã³ãŒããæé©åããããšã¯ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸãã
- èšç®ãæå°éã«æãã: é ç¹ã·ã§ãŒããŒã§ã¯å¿ èŠãªèšç®ã®ã¿ãå®è¡ããŸããåé·ãªèšç®ã¯é¿ããŠãã ããã
- çµã¿èŸŒã¿é¢æ°ã䜿çšãã: æ£èŠåãè¡åä¹ç®ããã¯ãã«æŒç®ãªã©ã®äžè¬çãªæäœã«ã¯ãWebGLã®çµã¿èŸŒã¿é¢æ°ãå©çšããŸãããããã®é¢æ°ã¯ãGPUã¢ãŒããã¯ãã£ã«åãããŠé«åºŠã«æé©åãããŠããããšãå€ãã§ãã
- åå²ãé¿ãã: ã·ã§ãŒããŒå
ã®åå²ïŒ
if
æïŒã¯ãäžéšã®GPUã§ããã©ãŒãã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ããããŸããå¯èœãªéããæ¡ä»¶ä»ãä»£å ¥ãä»ã®æè¡ã䜿çšããŠåå²ãé¿ããããã«ããŠãã ããã - ã«ãŒãå±é: ã·ã§ãŒããŒã«ã«ãŒããå«ãŸããŠããå ŽåãååŸ©åæ°ãã³ã³ãã€ã«æã«ããã£ãŠããã°ãã«ãŒããå±éããããšãæ€èšããŠãã ãããããã«ãããã«ãŒãã®ãªãŒããŒããããåæžã§ããŸãã
3. ãããã¡ç®¡çæŠç¥
å¹ççãªãããã¡ç®¡çã¯ãã¹ã ãŒãºãªãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯æäœã«äžå¯æ¬ ã§ãã
- ããã«ãããã¡ãªã³ã°: 1ã€ã¯å ¥åçšããã1ã€ã¯åºåçšã«2ã€ã®ãããã¡ã䜿çšããŸããåãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãã¹ã®åŸããããã¡ã®åœ¹å²ã亀æããŸããããã«ãããæžã蟌ã¿åŸã®èªã¿åããã¶ãŒããåé¿ãã䞊ååŠçãå¯èœã«ãªããŸãããã®ãã³ãã³æè¡ã¯ãç¶ç¶çãªåŠçãå¯èœã«ããããšã§ããã©ãŒãã³ã¹ãåäžãããŸãã
- ãããã¡ã®äºå確ä¿: ã¢ããªã±ãŒã·ã§ã³ã®éå§æã«äžåºŠãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãããã¡ã確ä¿ããåŸç¶ã®ãã¹ã§åå©çšããŸããããã«ããããããã¡ã®å²ãåœãŠãšè§£æŸãç¹°ãè¿ããªãŒããŒããããåé¿ã§ããŸãã
- åçãªãããã¡æŽæ°: 倿Žããããããã¡ã®éšåã®ã¿ãæŽæ°ããã«ã¯
gl.bufferSubData()
ã䜿çšããŸããããã¯ããããã¡å šäœãæžãæãããããå¹ççãªå ŽåããããŸãããã ããããã©ãŒãã³ã¹ã®äœäžãé¿ããããã«ãGPUã®ã¢ã©ã€ã¡ã³ãèŠä»¶ãæºããããŠããããšã確èªããŠãã ããã - ãããã¡ããŒã¿ã®ç Žæ£ (Orphan): ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãããã¡ã«æžã蟌ãåã«ã
gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, sizeInBytes, gl.DYNAMIC_COPY)
ãããŒã¿åŒæ°ã«null
ãæå®ããŠåŒã³åºãããšã§ãæ¢åã®ãããã¡ããŒã¿ããç Žæ£ãã§ããŸããããã«ããããã©ã€ãã¯å€ããããã¡ããŒã¿ãäžèŠã«ãªã£ãããšãèªèããã¡ã¢ãªç®¡çãæé©åã§ããŸãã
4. ã¯ãšãªãªããžã§ã¯ãã®æŽ»çš
ã¯ãšãªãªããžã§ã¯ãã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ããã»ã¹ã«é¢ãã貎éãªæ å ±ãæäŸã§ããŸãã
- ããªããã£ãæ°ã®æ±ºå®: ã¯ãšãªãªããžã§ã¯ãã䜿çšããŠããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãããã¡ã«æžã蟌ãŸããããªããã£ãã®æ°ã決å®ããŸããããã«ããããããã¡ãµã€ãºãåçã«èª¿æŽããããåŸç¶ã®ãã¹ã«å¿ èŠãªã¡ã¢ãªéãé©åã«å²ãåœãŠããããããšãã§ããŸãã
- ãªãŒããŒãããŒã®æ€åº: ã¯ãšãªãªããžã§ã¯ãã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãããã¡ãåºåããŒã¿ãã¹ãŠãæ ŒçŽããã®ã«ååãªå€§ããã§ãªãå Žåã«çºçãããªãŒããŒãããŒç¶æ ãæ€åºããããã«ã䜿çšã§ããŸããããã¯ããšã©ãŒãé²ããã·ãã¥ã¬ãŒã·ã§ã³ã®æŽåæ§ã確ä¿ããããã«éèŠã§ãã
5. ããŒããŠã§ã¢ã®å¶éã®çè§£
WebGLã®ããã©ãŒãã³ã¹ã¯ãåºç€ãšãªãããŒããŠã§ã¢ã«ãã£ãŠå€§ããç°ãªãå ŽåããããŸããã¿ãŒã²ãããã©ãããã©ãŒã ã®å¶éãèªèããããšãéèŠã§ãã
- GPUã®èœå: GPUã«ãã£ãŠããã©ãŒãã³ã¹ã¬ãã«ã¯ç°ãªããŸããäžè¬çã«ããã€ãšã³ãGPUã¯ããŒãšã³ãGPUããããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãå¹ççã«åŠçããŸããã¢ããªã±ãŒã·ã§ã³ã®ã¿ãŒã²ãããŠãŒã¶ãŒãèæ ®ããããã«å¿ããŠæé©åããŠãã ããã
- ãã©ã€ãã®æŽæ°: GPUãã©ã€ããææ°ã®ç¶æ ã«ä¿ã£ãŠãã ããããã©ã€ãã®æŽæ°ã«ã¯ãWebGLã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ã®ããããã©ãŒãã³ã¹æ¹åããã°ä¿®æ£ãå«ãŸããŠããããšããããããŸãã
- WebGLæ¡åŒµæ©èœ: ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã®ããã©ãŒãã³ã¹åäžãããããå¯èœæ§ã®ããå©çšå¯èœãªWebGLæ¡åŒµæ©èœãæ¢æ±ããŠãã ãããäŸãã°ã
EXT_blend_minmax
æ¡åŒµæ©èœã¯ãç¹å®ã®çš®é¡ã®ããŒãã£ã¯ã«ã·ãã¥ã¬ãŒã·ã§ã³ãæé©åããããã«äœ¿çšã§ããŸãã - 䞊ååŠç: ã¢ãŒããã¯ãã£ã«ãã£ãŠé ç¹ããŒã¿ã®åŠçæ¹æ³ãç°ãªããŸãã䞊ååŠçãšã¡ã¢ãªã¢ã¯ã»ã¹ãæé©åããã«ã¯ãã±ãŒã¹ãã€ã±ãŒã¹ã®æ€èšãå¿ èŠã«ãªãå ŽåããããŸãã
é ç¹ãã£ããã£ã®åŒ·åæè¡
åºæ¬çãªæé©åã«å ããŠãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã®ããã«é ç¹ãã£ããã£ã匷åããããã€ãã®æè¡ããããŸãã
1. ããŒãã£ã¯ã«ã·ã¹ãã
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãç¹ã«ããŒãã£ã¯ã«ã·ã¹ãã ã«é©ããŠããŸããåããŒãã£ã¯ã«ã®äœçœ®ãé床ããã®ä»ã®å±æ§ããã£ããã£ããããšã§ãè€éãªããŒãã£ã¯ã«ã®ãã€ããã¯ã¹ãã·ãã¥ã¬ãŒãã§ããŸãã
- åã®ã·ãã¥ã¬ãŒã·ã§ã³: é ç¹ã·ã§ãŒããŒã§éåã颚ãæåãªã©ã®åãé©çšããŠãããŒãã£ã¯ã«ã®éåºŠãæŽæ°ããŸãã
- è¡çªæ€åº: é ç¹ã·ã§ãŒããŒã§åºæ¬çãªè¡çªæ€åºãå®è£ ããããŒãã£ã¯ã«ãåºäœã®ãªããžã§ã¯ããééããã®ãé²ããŸãã
- 寿åœç®¡ç: åããŒãã£ã¯ã«ã«å¯¿åœãå²ãåœãŠã寿åœãè¶ ããããŒãã£ã¯ã«ãæ¶æ» ãããŸãã
- ããŒã¿ãããã³ã°: 転éãããããŒã¿éãæžããããã«ãè€æ°ã®ããŒãã£ã¯ã«ããããã£ãåäžã®é ç¹å±æ§ã«ããã¯ããŸããäŸãã°ãããŒãã£ã¯ã«ã®è²ãšå¯¿åœãåäžã®æµ®åå°æ°ç¹å€ã«ããã¯ããããšãã§ããŸãã
2. ããã·ãŒãžã£ã«ãžãªã¡ããªçæ
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãè€éãªããã·ãŒãžã£ã«ãžãªã¡ããªããªã¢ã«ã¿ã€ã ã§çæããããã«äœ¿çšã§ããŸãã
- ãã©ã¯ã¿ã«çæ: åºæ¬ãžãªã¡ããªãå埩çã«çްååããŠããã©ã¯ã¿ã«ãã¿ãŒã³ãäœæããŸãã
- å°åœ¢çæ: é ç¹ã·ã§ãŒããŒã§ãã€ãºé¢æ°ããã®ä»ã®ã¢ã«ãŽãªãºã ãé©çšããŠãå°åœ¢ããŒã¿ãçæããŸãã
- ã¡ãã·ã¥å€åœ¢: é ç¹ã·ã§ãŒããŒã§ãã£ã¹ãã¬ã€ã¹ã¡ã³ããããããã®ä»ã®å€åœ¢æè¡ãé©çšããŠãã¡ãã·ã¥ãå€åœ¢ãããŸãã
- é©å¿ç现åå²: æ²çããã®ä»ã®åºæºã«åºã¥ããŠã¡ãã·ã¥ã现åå²ããå¿ èŠãªé åã§ããé«è§£å床ã®ãžãªã¡ããªãäœæããŸãã
3. é«åºŠãªã¬ã³ããªã³ã°ãšãã§ã¯ã
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãããŸããŸãªé«åºŠãªã¬ã³ããªã³ã°ãšãã§ã¯ããå¯èœã«ããŸãã
- ã¹ã¯ãªãŒã³ã¹ããŒã¹ ã¢ã³ããšã³ããªã¯ã«ãŒãžã§ã³ (SSAO): ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã䜿çšããŠãã¹ã¯ãªãŒã³ã¹ããŒã¹ã®ã¢ã³ããšã³ããªã¯ã«ãŒãžã§ã³ããããçæããŸãã
- ã¢ãŒã·ã§ã³ãã©ãŒ: é ç¹ã®ä»¥åã®äœçœ®ããã£ããã£ããŠãã¢ãŒã·ã§ã³ãã©ãŒå¹æãäœæããŸãã
- ãã£ã¹ãã¬ã€ã¹ã¡ã³ããããã³ã°: ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã䜿çšããŠããã£ã¹ãã¬ã€ã¹ã¡ã³ããããã«åºã¥ããŠé ç¹ãå€äœããã詳现ãªè¡šé¢ã®å¹åžãäœæããŸãã
- ãžãªã¡ããªã·ã§ãŒããŒïŒæ¡åŒµæ©èœäœ¿çšæïŒ: æšæºã®WebGLã§ã¯ãããŸããããå©çšå¯èœãªå Žåããžãªã¡ããªã·ã§ãŒããŒã¯æ°ããããªããã£ããäœæããããšã§ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ãæ¡åŒµã§ããŸãã
ã³ãŒãäŸ
以äžã«ãäžèšã§èª¬æããæé©åæè¡ã瀺ãç°¡åãªã³ãŒãã¹ãããããããã€ã瀺ããŸãããããã¯èª¬æçšã§ãããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«åãããŠããã«é©å¿ãããå¿ èŠãããå Žåãããããšã«æ³šæããŠãã ããããŸããå æ¬çãªã³ãŒãã¯éåžžã«é·ããªããŸããããããã¯æé©åã®é åãæã瀺ããŠããŸãã
äŸïŒããã«ãããã¡ãªã³ã°
JavaScript:
let buffer1 = gl.createBuffer();
let buffer2 = gl.createBuffer();
let useBuffer1 = true;
function render() {
let readBuffer = useBuffer1 ? buffer1 : buffer2;
let writeBuffer = useBuffer1 ? buffer2 : buffer1;
gl.bindBuffer(gl.ARRAY_BUFFER, readBuffer);
// ... é ç¹å±æ§ã®èšå® ...
gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER, writeBuffer);
gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, sizeInBytes, gl.DYNAMIC_COPY);
gl.beginTransformFeedback(gl.POINTS); // äŸïŒãã€ã³ãã®ã¬ã³ããªã³ã°
gl.drawArrays(gl.POINTS, 0, vertexCount);
gl.endTransformFeedback();
useBuffer1 = !useBuffer1; // 次ã®ãã¬ãŒã ã®ããã«ãããã¡ã亀æ
}
äŸïŒVarying倿°ã®æ°ãæžããïŒé ç¹ã·ã§ãŒããŒïŒ
GLSL:
#version 300 es
in vec4 position;
//out vec3 normal; // äžèŠãªVaryingãåé€
void main() {
gl_Position = position;
// å¿
èŠãªã®ãäœçœ®ã ããªããäœçœ®ã®ã¿ãåºå
}
äŸïŒBuffer Sub Data (JavaScript)
// 'position'屿§ã®ã¿æŽæ°ãå¿
èŠã ãšä»®å®
let positionData = new Float32Array(updatedPositions);
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferSubData(gl.ARRAY_BUFFER, 0, positionData);
ã±ãŒã¹ã¹ã¿ãã£ãšå®äžçã®å¿çš
ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãããŸããŸãªåéã§å¿çšãããŠããŸããããã€ãã®å®äžçã®äŸãèŠãŠã¿ãŸãããã
- ç§åŠçå¯èŠå: èšç®æµäœååŠïŒCFDïŒã§ã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã䜿çšããŠæµäœäžã®ç²åã®åããã·ãã¥ã¬ãŒãã§ããŸãã
- ã²ãŒã éçº: ç ãçãççºãªã©ã®ããŒãã£ã¯ã«ãšãã§ã¯ãã¯ããã°ãã°ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã䜿çšããŠå®è£ ãããŸãã
- ããŒã¿å¯èŠå: ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãããŒã¿ãã€ã³ããé ç¹ã®äœçœ®ã屿§ã«ãããã³ã°ããããšã§ãå€§èŠæš¡ãªããŒã¿ã»ãããå¯èŠåããããã«äœ¿çšã§ããŸãã
- ãžã§ãã¬ãŒãã£ãã¢ãŒã: ãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã䜿çšããŠãæ°åŠçãªæ¹çšåŒãã¢ã«ãŽãªãºã ã«åºã¥ããŠé ç¹ã®äœçœ®ãæŽæ°ããå埩ããã»ã¹ãéããŠãè€éãªèŠèŠãã¿ãŒã³ãã¢ãã¡ãŒã·ã§ã³ãäœæããŸãã
çµè«
WebGLãã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ã¯ãè€éã§ãã€ãããã¯ãªã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®åŒ·åãªããŒã«ã§ãããã®å éšã®ä»çµã¿ãçè§£ãããã®èšäºã§èª¬æããæé©åæè¡ãé©çšããããšã§ãå€§å¹ ãªããã©ãŒãã³ã¹åäžãéæããèŠèŠçã«èŠäºãªãšãã§ã¯ããäœæã§ããŸããã³ãŒãããããã¡ã€ã«ããããŸããŸãªæé©åæŠç¥ã詊ããŠãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æé©ãªã¢ãããŒããèŠã€ããããšãå¿ããªãã§ãã ãããWebGLã®æé©åã«ã¯ãããŒããŠã§ã¢ãšã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®çè§£ãå¿ èŠã§ããè¿œå æ©èœã®ããã«æ¡åŒµæ©èœãæ¢æ±ããããè¯ãã°ããŒãã«ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ããã«ããã©ãŒãã³ã¹ã念é ã«çœ®ããŠèšèšããŠãã ããã
åèæç®
- WebGL Specification: https://www.khronos.org/registry/webgl/specs/latest/2.0/
- MDN WebGL Tutorial: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API
- WebGL Insights: https://webglinsights.github.io/