WebGLã¢ãããã¯æäœã®è©³çŽ°è§£èª¬ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ãããã¹ã¬ããã»ãŒããªGPUèšç®ã®ããã®æ©èœããŠãŒã¹ã±ãŒã¹ãããã©ãŒãã³ã¹ãžã®åœ±é¿ããã¹ããã©ã¯ãã£ã¹ãæ¢ããŸãã
WebGLã®ã¢ãããã¯æäœïŒã¹ã¬ããã»ãŒããªGPUã³ã³ãã¥ãŒãã£ã³ã°ã®å®çŸ
WebGLã¯ããã©ã°ã€ã³ã䜿çšããã«ãäºææ§ã®ãããŠã§ããã©ãŠã¶å ã§ã€ã³ã¿ã©ã¯ãã£ããª2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®åŒ·åãªJavaScript APIã§ããããŠã§ãããŒã¹ã®ããžã¥ã¢ã«äœéšã«é©åœããããããŸããããŠã§ãã¢ããªã±ãŒã·ã§ã³ããŸããŸãè€éã«ãªããGPUãžã®èŠæ±ãé«ãŸãã«ã€ããŠãã·ã§ãŒããŒå ã§ã®å¹ççã§ä¿¡é Œæ§ã®é«ãããŒã¿ç®¡çã®å¿ èŠæ§ãæéèŠèª²é¡ãšãªã£ãŠããŸããããã§WebGLã®ã¢ãããã¯æäœãç»å ŽããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãWebGLã®ã¢ãããã¯æäœã®äžçãæãäžãããã®ç®çã説æããããŸããŸãªãŠãŒã¹ã±ãŒã¹ãæ¢ããããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ãåæããã¹ã¬ããã»ãŒããªGPUã³ã³ãã¥ãŒãã£ã³ã°ãå®çŸããããã®ãã¹ããã©ã¯ãã£ã¹ãæŠèª¬ããŸãã
ã¢ãããã¯æäœãšã¯ïŒ
䞊è¡ããã°ã©ãã³ã°ã«ãããŠãã¢ãããã¯æäœãšã¯ãä»ã®äžŠè¡æäœããã®å¹²æžãåããã«å®è¡ãããããšãä¿èšŒããããäžå¯åãªæäœã®ããšã§ãããã®ããªãŒã«ãªã¢ããã·ã³ã°ãã®ç¹æ§ã¯ããã«ãã¹ã¬ããç°å¢ã䞊åç°å¢ã§ããŒã¿ã®æŽåæ§ãç¶æããããã«äžå¯æ¬ ã§ããã¢ãããã¯æäœããªããã°ãç«¶åç¶æ ãçºçããäºæž¬äžå¯èœã§æœåšçã«æ²æšãªçµæã«ã€ãªããå¯èœæ§ããããŸããWebGLã®æèã§ã¯ãããã¯è€æ°ã®ã·ã§ãŒããŒåŒã³åºããåæã«åãã¡ã¢ãªäœçœ®ã倿ŽããããšããããŒã¿ãç Žæãããå¯èœæ§ãããããšãæå³ããŸãã
è€æ°ã®ã¹ã¬ãããã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããããšããŠãããšæ³åããŠã¿ãŠãã ãããã¢ãããã¯æ§ããªããã°ãããã¹ã¬ãããã«ãŠã³ã¿ãŒå€ãèªã¿åããæåã®ã¹ã¬ãããã€ã³ã¯ãªã¡ã³ããããå€ãæžã蟌ãåã«ããäžã€ã®ã¹ã¬ãããåãå€ãèªã¿åãããã®åŸäž¡æ¹ã®ã¹ã¬ãããåãã€ã³ã¯ãªã¡ã³ããããå€ãæžãæ»ããŠããŸããããããŸãããçµæãšããŠã1ã€ã®ã€ã³ã¯ãªã¡ã³ãã倱ãããŠããŸããŸããã¢ãããã¯æäœã¯ãåã€ã³ã¯ãªã¡ã³ããäžå¯åã«å®è¡ãããããšãä¿èšŒããã«ãŠã³ã¿ãŒã®æ£ç¢ºæ§ãç¶æããŸãã
WebGLãšGPUã®äžŠåæ§
WebGLã¯ãGPUïŒGraphics Processing UnitïŒã®æã€å€§èŠæš¡ãªäžŠåæ§ã掻çšããŸããGPUäžã§å®è¡ãããããã°ã©ã ã§ããã·ã§ãŒããŒã¯ãéåžžãåãã¯ã»ã«ïŒãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒãŸãã¯é ç¹ïŒããŒããã¯ã¹ã·ã§ãŒããŒïŒã«å¯ŸããŠäžŠåã«å®è¡ãããŸãããã®åºæã®äžŠåæ§ã¯ãã°ã©ãã£ãã¯ã¹åŠçã«å€§ããªããã©ãŒãã³ã¹äžã®å©ç¹ããããããŸããããããããã¯åæã«ãè€æ°ã®ã·ã§ãŒããŒåŒã³åºããåãã¡ã¢ãªäœçœ®ã«åæã«ã¢ã¯ã»ã¹ããŠå€æŽã詊ã¿ãå Žåã«ãããŒã¿ç«¶åãçºçããå¯èœæ§ãçããããŸãã
ã·ã§ãŒããŒã«ãã£ãŠåããŒãã£ã¯ã«ã®äœçœ®ã䞊åã«æŽæ°ãããããŒãã£ã¯ã«ã·ã¹ãã ãèããŠã¿ãŸããããããè€æ°ã®ããŒãã£ã¯ã«ãå¶ç¶åãå Žæã§è¡çªããããããã¹ãŠãå ±æã®è¡çªã«ãŠã³ã¿ãŒãåæã«æŽæ°ããããšããå Žåãã¢ãããã¯æäœããªããã°è¡çªã«ãŠã³ãã¯äžæ£ç¢ºã«ãªãå¯èœæ§ããããŸãã
WebGLã¢ãããã¯ã«ãŠã³ã¿ãŒã®ç޹ä»
WebGLã¢ãããã¯ã«ãŠã³ã¿ãŒã¯ãGPUã¡ã¢ãªå ã«ååšããç¹å¥ãªå€æ°ã§ãã¢ãããã¯ã«ã€ã³ã¯ãªã¡ã³ããŸãã¯ãã¯ãªã¡ã³ãããããšãã§ããŸãããããã¯ãã·ã§ãŒããŒå ã§ã¹ã¬ããã»ãŒããªã¢ã¯ã»ã¹ãšå€æŽãæäŸããããã«ç¹å¥ã«èšèšãããŠããŸãããããã¯OpenGL ES 3.1仿§ã®äžéšã§ãããWebGL 2.0ããã³ãã以éã®ããŒãžã§ã³ã®WebGLã§ã¯`GL_EXT_shader_atomic_counters`ã®ãããªæ¡åŒµæ©èœãéããŠãµããŒããããŠããŸããWebGL 1.0ã¯ãã€ãã£ãã§ã¯ã¢ãããã¯æäœããµããŒãããŠããããããè€éã§å¹çã®æªãææ³ãçšããåé¿çãå¿ èŠã«ãªããŸãã
WebGLã¢ãããã¯ã«ãŠã³ã¿ãŒã®äž»ãªç¹åŸŽïŒ
- ã¢ãããã¯æäœïŒ ã¢ãããã¯ãªã€ã³ã¯ãªã¡ã³ãïŒ`atomicCounterIncrement`ïŒããã³ãã¯ãªã¡ã³ãïŒ`atomicCounterDecrement`ïŒæäœããµããŒãããŸãã
- ã¹ã¬ããã»ãŒããã£ïŒ ãããã®æäœãã¢ãããã¯ã«å®è¡ãããããšãä¿èšŒããç«¶åç¶æ ãé²ããŸãã
- GPUã¡ã¢ãªãžã®é çœ®ïŒ ã¢ãããã¯ã«ãŠã³ã¿ãŒã¯GPUã¡ã¢ãªå ã«ååšããã·ã§ãŒããŒããã®å¹ççãªã¢ã¯ã»ã¹ãå¯èœã«ããŸãã
- éå®ãããæ©èœïŒ äž»ã«æŽæ°å€ã®ã€ã³ã¯ãªã¡ã³ããšãã¯ãªã¡ã³ãã«çŠç¹ãåœãŠãŠããŸããããè€éãªã¢ãããã¯æäœã«ã¯ä»ã®ææ³ãå¿ èŠã§ãã
WebGLã§ã®ã¢ãããã¯ã«ãŠã³ã¿ãŒã®æ±ãæ¹
WebGLã§ã¢ãããã¯ã«ãŠã³ã¿ãŒã䜿çšããã«ã¯ãããã€ãã®ã¹ããããå¿ èŠã§ãïŒ
- æ¡åŒµæ©èœã®æå¹åïŒå¿ èŠãªå ŽåïŒïŒ WebGL 2.0ã§ã¯ã`GL_EXT_shader_atomic_counters`æ¡åŒµæ©èœã確èªããŠæå¹åããŸããWebGL 1.0ã§ã¯ä»£æ¿ã¢ãããŒããå¿ èŠã§ãã
- ã·ã§ãŒããŒã§ã®ã¢ãããã¯ã«ãŠã³ã¿ãŒã®å®£èšïŒ ã·ã§ãŒããŒã³ãŒãå ã§`atomic_uint`修食åã䜿çšããŠã¢ãããã¯ã«ãŠã³ã¿ãŒå€æ°ã宣èšããŸãããŸããã¬ã€ã¢ãŠã修食åã䜿çšããŠããã®ã¢ãããã¯ã«ãŠã³ã¿ãŒãç¹å®ã®ãã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãããå¿ èŠããããŸãã
- ãããã¡ãªããžã§ã¯ãã®äœæïŒ ã¢ãããã¯ã«ãŠã³ã¿ãŒã®å€ãæ ŒçŽããããã®WebGLãããã¡ãªããžã§ã¯ããäœæããŸãããã®ãããã¡ã¯`GL_ATOMIC_COUNTER_BUFFER`ã¿ãŒã²ããã§äœæããå¿ èŠããããŸãã
- ãããã¡ãã¢ãããã¯ã«ãŠã³ã¿ãŒã®ãã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãïŒ `gl.bindBufferBase`ãŸãã¯`gl.bindBufferRange`ã䜿çšããŠããããã¡ãç¹å®ã®ã¢ãããã¯ã«ãŠã³ã¿ãŒã®ãã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãããŸãããã®ãã€ã³ãã£ã³ã°ãã€ã³ãã¯ãã·ã§ãŒããŒå ã®ã¬ã€ã¢ãŠã修食åã«å¯Ÿå¿ããŸãã
- ã·ã§ãŒããŒã§ã®ã¢ãããã¯æäœã®å®è¡ïŒ ã·ã§ãŒããŒã³ãŒãå ã§`atomicCounterIncrement`ããã³`atomicCounterDecrement`颿°ã䜿çšããŠãã«ãŠã³ã¿ãŒã®å€ãã¢ãããã¯ã«å€æŽããŸãã
- ã«ãŠã³ã¿ãŒå€ã®ååŸïŒ ã·ã§ãŒããŒãå®è¡ãããåŸã`gl.getBufferSubData`ã䜿çšããŠãããã¡ããã«ãŠã³ã¿ãŒå€ãååŸããŸãã
äŸïŒ`GL_EXT_shader_atomic_counters`ã䜿çšããWebGL 2.0ïŒïŒ
é ç¹ã·ã§ãŒããŒïŒãã¹ã¹ã«ãŒïŒïŒ
#version 300 es
in vec4 a_position;
void main() {
gl_Position = a_position;
}
ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒ
#version 300 es
#extension GL_EXT_shader_atomic_counters : require
layout(binding = 0) uniform atomic_uint collisionCounter;
out vec4 fragColor;
void main() {
atomicCounterIncrement(collisionCounter);
fragColor = vec4(1.0, 0.0, 0.0, 1.0); // Red
}
JavaScriptã³ãŒãïŒç°¡æçïŒïŒ
const gl = canvas.getContext('webgl2'); // Or webgl, check for extensions
const ext = gl.getExtension('EXT_shader_atomic_counters');
if (!ext && gl.isContextLost()) {
console.error('Atomic counter extension not supported or context lost.');
return;
}
// Create and compile shaders (vertexShaderSource, fragmentShaderSource are assumed to be defined)
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
const program = createProgram(gl, vertexShader, fragmentShader);
gl.useProgram(program);
// Create atomic counter buffer
const counterBuffer = gl.createBuffer();
gl.bindBuffer(gl.ATOMIC_COUNTER_BUFFER, counterBuffer);
gl.bufferData(gl.ATOMIC_COUNTER_BUFFER, new Uint32Array([0]), gl.DYNAMIC_COPY);
// Bind buffer to binding point 0 (matches layout in shader)
gl.bindBufferBase(gl.ATOMIC_COUNTER_BUFFER, 0, counterBuffer);
// Draw something (e.g., a triangle)
gl.drawArrays(gl.TRIANGLES, 0, 3);
// Read back the counter value
const counterValue = new Uint32Array(1);
gl.bindBuffer(gl.ATOMIC_COUNTER_BUFFER, counterBuffer);
gl.getBufferSubData(gl.ATOMIC_COUNTER_BUFFER, 0, counterValue);
console.log('Collision Counter:', counterValue[0]);
WebGLã«ãããã¢ãããã¯æäœã®ãŠãŒã¹ã±ãŒã¹
ã¢ãããã¯æäœã¯ã䞊åGPUã³ã³ãã¥ãŒãã£ã³ã°ã§å ±æããŒã¿ã管çããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãã以äžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ãããã€ã瀺ããŸãïŒ
- è¡çªæ€åºïŒ åã®äŸã§ç€ºããããã«ãã¢ãããã¯ã«ãŠã³ã¿ãŒã¯ããŒãã£ã¯ã«ã·ã¹ãã ããã®ä»ã®ã·ãã¥ã¬ãŒã·ã§ã³ã§ã®è¡çªåæ°ã远跡ããããã«äœ¿çšã§ããŸããããã¯ããªã¢ã«ãªç©çã·ãã¥ã¬ãŒã·ã§ã³ãã²ãŒã éçºãç§åŠçèŠèŠåã«ãšã£ãŠéèŠã§ãã
- ãã¹ãã°ã©ã çæïŒ ã¢ãããã¯æäœã䜿çšãããšãGPUäžã§çŽæ¥ãã¹ãã°ã©ã ãå¹ççã«çæã§ããŸããåã·ã§ãŒããŒåŒã³åºãã¯ããã¯ã»ã«ã®å€ã«åºã¥ããŠãã¹ãã°ã©ã ã®å¯Ÿå¿ãããã³ãã¢ãããã¯ã«ã€ã³ã¯ãªã¡ã³ãã§ããŸããããã¯ãç»ååŠçãããŒã¿åæãç§åŠèšç®ã§åœ¹ç«ã¡ãŸããäŸãã°ãå»çç»åå ã®èŒåºŠå€ã®ãã¹ãã°ã©ã ãçæããŠãç¹å®ã®çµç¹ã¿ã€ãã匷調衚瀺ããããšãã§ããŸãã
- é åºéäŸåã®éæåºŠïŒOITïŒïŒ OITã¯ãéæãªãªããžã§ã¯ããæç»é ã«äŸåããã«åŠçããããã®ã¬ã³ããªã³ã°æè¡ã§ããã¢ãããã¯æäœãé£çµãªã¹ããšçµã¿åãããããšã§ãéãªãåããã©ã°ã¡ã³ãã®è²ãšäžéæåºŠãèç©ããä»»æã®ã¬ã³ããªã³ã°é åºã§ãæ£ãããã¬ã³ãã£ã³ã°ãå¯èœã«ããŸããããã¯ãéæãªãããªã¢ã«ãæã€è€éãªã·ãŒã³ã®ã¬ã³ããªã³ã°ã§äžè¬çã«äœ¿çšãããŸãã
- ã¯ãŒã¯ãã¥ãŒïŒ ã¢ãããã¯æäœã¯ãGPUäžã®ã¯ãŒã¯ãã¥ãŒã管çããããã«äœ¿çšã§ããŸããäŸãã°ãã·ã§ãŒããŒã¯ã«ãŠã³ã¿ãŒãã¢ãããã¯ã«ã€ã³ã¯ãªã¡ã³ãããŠããã¥ãŒå ã®æ¬¡ã«å©çšå¯èœãªäœæ¥é ç®ãèŠæ±ã§ããŸããããã«ããã䞊åèšç®ã«ãããåçãªã¿ã¹ã¯å²ãåœãŠãšè² è·åæ£ãå¯èœã«ãªããŸãã
- ãªãœãŒã¹ç®¡çïŒ ã·ã§ãŒããŒãåçã«ãªãœãŒã¹ãå²ãåœãŠãå¿ èŠãããã·ããªãªã§ã¯ãã¢ãããã¯æäœãå©çšå¯èœãªãªãœãŒã¹ã®ããŒã«ã管çããããã«äœ¿çšã§ããŸããã·ã§ãŒããŒã¯å¿ èŠã«å¿ããŠãªãœãŒã¹ãã¢ãããã¯ã«èŠæ±ããã³è§£æŸãããªãœãŒã¹ãéå°ã«å²ãåœãŠãããªãããã«ããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
ã¢ãããã¯æäœã¯ã¹ã¬ããã»ãŒããªGPUã³ã³ãã¥ãŒãã£ã³ã°ã«å€§ããªå©ç¹ããããããŸããããã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããããšãéèŠã§ãïŒ
- åæãªãŒããŒãããïŒ ã¢ãããã¯æäœã¯ãååæ§ãä¿èšŒããããã«æ¬è³ªçã«åæã¡ã«ããºã ã䌎ããŸãããã®åæã¯ãªãŒããŒããããåŒãèµ·ãããå®è¡é床ãäœäžãããå¯èœæ§ããããŸãããã®ãªãŒããŒãããã®åœ±é¿ã¯ãç¹å®ã®ããŒããŠã§ã¢ãã¢ãããã¯æäœã®é »åºŠã«ãã£ãŠç°ãªããŸãã
- ã¡ã¢ãªç«¶åïŒ è€æ°ã®ã·ã§ãŒããŒåŒã³åºããé »ç¹ã«åãã¢ãããã¯ã«ãŠã³ã¿ãŒã«ã¢ã¯ã»ã¹ãããšãç«¶åãçºçããããã©ãŒãã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ããããŸããããã¯ãäžåºŠã«1ã€ã®åŒã³åºãããã«ãŠã³ã¿ãŒã倿Žã§ãããä»ã®åŒã³åºããåŸ æ©ã匷å¶ãããããã§ãã
- 代æ¿ã¢ãããŒãïŒ ã¢ãããã¯æäœã«é Œãåã«ãããå¹ççãªå¯èœæ§ã®ãã代æ¿ã¢ãããŒããæ€èšããŠãã ãããäŸãã°ãåäžã®ã¢ãããã¯æŽæ°ãå®è¡ããåã«ïŒå ±æã¡ã¢ãªã䜿çšããŠïŒåã¯ãŒã¯ã°ã«ãŒãå ã§ããŒã«ã«ã«ããŒã¿ãéçŽã§ããã°ãå€ãã®å Žåãç«¶åãæžããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
- ããŒããŠã§ã¢ã«ããå·®ç°ïŒ ã¢ãããã¯æäœã®ããã©ãŒãã³ã¹ç¹æ§ã¯ãç°ãªãGPUã¢ãŒããã¯ãã£ããã©ã€ãã«ãã£ãŠå€§ããç°ãªãå ŽåããããŸããæœåšçãªããã«ããã¯ãç¹å®ããããã«ãããŸããŸãªããŒããŠã§ã¢æ§æã§ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããããšãäžå¯æ¬ ã§ãã
WebGLã¢ãããã¯æäœã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
WebGLã§ã¢ãããã¯æäœã®å©ç¹ãæå€§åããããã©ãŒãã³ã¹ãªãŒããŒããããæå°éã«æããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
- ç«¶åãæå°éã«æããïŒ ã¢ãããã¯ã«ãŠã³ã¿ãŒã§ã®ç«¶åãæå°éã«æããããã«ã·ã§ãŒããŒãèšèšããŸããå¯èœã§ããã°ãã¯ãŒã¯ã°ã«ãŒãå ã§ããŒã«ã«ã«ããŒã¿ãéçŽããããã¹ãã£ãã¿ãŒ/ã®ã£ã¶ãŒã®ãããªæè¡ã䜿çšããŠæžã蟌ã¿ãè€æ°ã®ã¡ã¢ãªäœçœ®ã«åæ£ãããŸãã
- æ§ããã«äœ¿çšããïŒ ã¹ã¬ããã»ãŒããªããŒã¿ç®¡çã«æ¬åœã«å¿ èŠãªå Žåã«ã®ã¿ã¢ãããã¯æäœã䜿çšããŸããå ±æã¡ã¢ãªãããŒã¿è€è£œãªã©ã®ä»£æ¿ã¢ãããŒãããããè¯ãããã©ãŒãã³ã¹ã§ç®çã®çµæãéæã§ããå Žåã¯ãããããæ¢æ±ããŠãã ããã
- é©åãªããŒã¿åãéžæããïŒ ã¢ãããã¯ã«ãŠã³ã¿ãŒã«ã¯å¯èœãªéãæå°ã®ããŒã¿åã䜿çšããŸããäŸãã°ãå°ããªæ°ãŸã§ããã«ãŠã³ãããå¿ èŠããªãå Žåã¯ã`atomic_int`ã®ä»£ããã«`atomic_uint`ã䜿çšããŸãã
- ã³ãŒãããããã¡ã€ãªã³ã°ããïŒ WebGLã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãããã¡ã€ãªã³ã°ããŠãã¢ãããã¯æäœã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãããã©ãŠã¶ãã°ã©ãã£ãã¯ã¹ãã©ã€ããæäŸãããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãGPUã®å®è¡ãšã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãåæããŸãã
- ãã¯ã¹ãã£ããŒã¹ã®ä»£æ¿æ¡ãæ€èšããïŒ å Žåã«ãã£ãŠã¯ããã¯ã¹ãã£ããŒã¹ã®ã¢ãããŒãïŒãã¬ãŒã ãããã¡ãã£ãŒãããã¯ãšãã¬ã³ãã£ã³ã°ã¢ãŒãã䜿çšïŒããç¹ã«å€ã®èç©ã䌎ãæäœã«å¯ŸããŠãã¢ãããã¯æäœã®ããã©ãŒãã³ã¹ã®é«ãä»£æ¿ææ®µãšãªãåŸãŸãããã ãããããã®ã¢ãããŒãã¯ããã¯ã¹ãã£ãã©ãŒããããšãã¬ã³ãã£ã³ã°é¢æ°ã®æ éãªç®¡çãå¿ èŠãšããããšããããããŸãã
- ããŒããŠã§ã¢ã®å¶éãçè§£ããïŒ ã¿ãŒã²ããããŒããŠã§ã¢ã®å¶éã«æ³šæããŠãã ãããäžéšã®GPUã§ã¯ãåæã«äœ¿çšã§ããã¢ãããã¯ã«ãŠã³ã¿ãŒã®æ°ããã¢ãããã¯ã«å®è¡ã§ããæäœã®çš®é¡ã«å¶éãããå ŽåããããŸãã
- WebAssemblyãšã®çµ±åïŒ WebAssemblyïŒWASMïŒãšWebGLã®çµ±åãæ¢æ±ããŸããWASMã¯ãã¡ã¢ãªç®¡çãšåæã®ããè¯ãå¶åŸ¡ãæäŸããããšãå€ããè€éãªäžŠåã¢ã«ãŽãªãºã ã®ããå¹ççãªå®è£ ãå¯èœã«ããŸããWASMã¯ãWebGLã®ç¶æ ãèšå®ããããã«äœ¿çšãããããŒã¿ãèšç®ããããWebGLã䜿çšããŠã¬ã³ããªã³ã°ãããããŒã¿ãæäŸãããã§ããŸãã
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒãæ¢æ±ããïŒ ã¢ããªã±ãŒã·ã§ã³ãã¢ãããã¯æäœããã®ä»ã®é«åºŠãªäžŠåèšç®ãå€çšããå Žåã¯ãã³ã³ãã¥ãŒãã·ã§ãŒããŒïŒWebGL 2.0以éã§æ¡åŒµæ©èœãéããŠå©çšå¯èœïŒã®äœ¿çšãæ€èšããŠãã ãããã³ã³ãã¥ãŒãã·ã§ãŒããŒã¯ãGPUã³ã³ãã¥ãŒãã£ã³ã°ã®ããã®ããæ±çšçãªããã°ã©ãã³ã°ã¢ãã«ãæäŸãããã倧ããªæè»æ§ãšå¶åŸ¡ãå¯èœã«ããŸãã
WebGL 1.0ã«ãããã¢ãããã¯æäœïŒåé¿ç
WebGL 1.0ã¯ãã€ãã£ãã§ã¯ã¢ãããã¯æäœããµããŒãããŠããŸãããããããäžè¬çã«ã¯å¹çãæªããããè€éã§ãããåé¿çã¯ååšããŸãã
- ãã¬ãŒã ãããã¡ãã£ãŒãããã¯ãšãã¬ã³ãã£ã³ã°ïŒ ãã®æè¡ã¯ããã¬ãŒã ãããã¡ãã£ãŒãããã¯ãšæ éã«æ§æããããã¬ã³ãã£ã³ã°ã¢ãŒãã䜿çšããŠãã¯ã¹ãã£ã«ã¬ã³ããªã³ã°ããããšãå«ã¿ãŸãããã¬ã³ãã£ã³ã°ã¢ãŒãã`gl.FUNC_ADD`ã«èšå®ããé©åãªãã¯ã¹ãã£ãã©ãŒãããã䜿çšããããšã§ããã¯ã¹ãã£å ã§å¹æçã«å€ãèç©ã§ããŸããããã¯ã¢ãããã¯ãªã€ã³ã¯ãªã¡ã³ãæäœãã·ãã¥ã¬ãŒãããããã«äœ¿çšã§ããŸãããããããã®ã¢ãããŒãã«ã¯ããŒã¿åãå®è¡å¯èœãªæäœã®çš®é¡ã«é¢ããŠå¶éããããŸãã
- ãã«ããã¹ïŒ èšç®ãè€æ°ã®ãã¹ã«åå²ããŸããåãã¹ã§ãã·ã§ãŒããŒåŒã³åºãã®ãµãã»ãããå ±æããŒã¿ã«ã¢ã¯ã»ã¹ããŠå€æŽã§ããŸãããã¹éã®åæã¯ã`gl.finish`ã`gl.fenceSync`ã䜿çšããŠã次ã®ãã¹ã«é²ãåã«åã®ãã¹ãŠã®æäœãå®äºããããšãä¿èšŒããããšã§å®çŸãããŸãããã®ã¢ãããŒãã¯è€éã§ããã倧ããªãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸãã
ãããã®åé¿çã®ããã©ãŒãã³ã¹äžã®å¶éãšè€éãã®ãããã¢ãããã¯æäœãå¿ èŠãªå Žåã¯ãäžè¬çã«WebGL 2.0以éãã¿ãŒã²ããã«ããïŒãŸãã¯äºææ§ã¬ã€ã€ãŒãåŠçããã©ã€ãã©ãªã䜿çšããïŒããšãæšå¥šãããŸãã
çµè«
WebGLã®ã¢ãããã¯æäœã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã§ã¹ã¬ããã»ãŒããªGPUã³ã³ãã¥ãŒãã£ã³ã°ãå®çŸããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãããã®æ©èœããŠãŒã¹ã±ãŒã¹ãããã©ãŒãã³ã¹ãžã®åœ±é¿ããããŠãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ãéçºè ã¯ã¢ãããã¯æäœã掻çšããŠãããå¹ççã§ä¿¡é Œæ§ã®é«ã䞊åã¢ã«ãŽãªãºã ãäœæã§ããŸããã¢ãããã¯æäœã¯æ éã«äœ¿çšãã¹ãã§ãããè¡çªæ€åºããã¹ãã°ã©ã çæãé åºéäŸåã®éæåºŠããªãœãŒã¹ç®¡çãªã©ãå¹ åºãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ã§ããWebGLãé²åãç¶ããã«ã€ããŠãã¢ãããã¯æäœãè€éã§ããã©ãŒãã³ã¹ã®é«ããŠã§ãããŒã¹ã®ããžã¥ã¢ã«äœéšãå®çŸããäžã§ãŸããŸãéèŠãªåœ¹å²ãæããããšã¯ééããããŸããã
äžèšã®ã¬ã€ãã©ã€ã³ãèæ ®ããããšã§ãäžçäžã®éçºè ã¯ããšã³ããŠãŒã¶ãŒã䜿çšããããã€ã¹ããã©ãŠã¶ã«é¢ä¿ãªããèªèº«ã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãããã©ãŒãã³ã¹ãé«ããã¢ã¯ã»ã¹ããããããã°ã®ãªãç¶æ ãç¶æã§ããããã«ããããšãã§ããŸãã