WebGLã«ãããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã®æŠå¿µãæ¢æ±ããããã©ãŒãã³ã¹ãžã®åœ±é¿ãçè§£ããWebã¢ããªã±ãŒã·ã§ã³ã§ã®ããã¹ã ãŒãºã§é«éãªã¬ã³ããªã³ã°ã®ããã«å¹æçãªã·ã§ãŒããŒç¶æ 管çãå®è£ ããæ¹æ³ãåŠã³ãŸãã
WebGL ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ïŒããã©ãŒãã³ã¹åäžã®ããã®ã·ã§ãŒããŒç¶æ ã®æé©å
WebGLã¯ãWebãã©ãŠã¶å ã§2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®åŒ·åãªAPIã§ããããããWebGLã¢ããªã±ãŒã·ã§ã³ã§æé©ãªããã©ãŒãã³ã¹ãéæããã«ã¯ãåºç€ãšãªãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãšã·ã§ãŒããŒç¶æ ã®å¹ççãªç®¡çã«ã€ããŠæ·±ãçè§£ããå¿ èŠããããŸãããã®äžã§ãéèŠãªåŽé¢ã®äžã€ããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ïŒã·ã§ãŒããŒã¹ããŒããã£ãã·ã¥ãšããŠãç¥ãããŠããŸãïŒã§ãããã®èšäºã§ã¯ãã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã®æŠå¿µãæãäžãããã®ä»çµã¿ãéèŠæ§ããããŠWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããã«ãããæŽ»çšããæ¹æ³ã«ã€ããŠèª¬æããŸãã
WebGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãçè§£ãã
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã«ã€ããŠæãäžããåã«ãWebGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®åºæ¬çãªã¹ããããçè§£ããããšãäžå¯æ¬ ã§ãããã€ãã©ã€ã³ã¯ã倧ãŸãã«ä»¥äžã®ã¹ããŒãžã«åããããšãã§ããŸãïŒ
- é ç¹ã·ã§ãŒããŒ: ãžãªã¡ããªã®é ç¹ãåŠçããã¢ãã«ç©ºéããã¹ã¯ãªãŒã³ç©ºéã«å€æããŸãã
- ã©ã¹ã¿ã©ã€ãŒãŒã·ã§ã³: 倿ãããé ç¹ããã©ã°ã¡ã³ãïŒæœåšçãªãã¯ã»ã«ïŒã«å€æããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒ: ã©ã€ãã£ã³ã°ããã¯ã¹ãã£ããããªã¢ã«ã®ããããã£ãªã©ãæ§ã ãªèŠå ã«åºã¥ããŠåãã©ã°ã¡ã³ãã®è²ã決å®ããŸãã
- ãã¬ã³ãã£ã³ã°ãšåºå: ãã©ã°ã¡ã³ãã®è²ãæ¢åã®ãã¬ãŒã ãããã¡ã®å 容ãšåæããæçµçãªç»åãçæããŸãã
ãããã®åã¹ããŒãžã¯ã䜿çšãããŠããã·ã§ãŒããŒããã°ã©ã ãã¢ã¯ãã£ããªãã¯ã¹ãã£ãã·ã§ãŒããŒãŠããã©ãŒã ã®å€ãªã©ãç¹å®ã®ç¶æ 倿°ã«äŸåããŠããŸãããããã®ç¶æ 倿°ãé »ç¹ã«å€æŽãããšãããã©ãŒãã³ã¹ã«åœ±é¿ãäžãã倧ããªãªãŒããŒããããçºçããå¯èœæ§ããããŸãã
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãšã¯ïŒ
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯ãWebGLã®å®è£ ãã·ã§ãŒããŒãŠããã©ãŒã ããã®ä»ã®ç¶æ 倿°ãèšå®ããããã»ã¹ãæé©åããããã«äœ¿çšããæè¡ã§ããWebGL颿°ãåŒã³åºããŠãŠããã©ãŒã å€ãèšå®ãããããã¯ã¹ãã£ããã€ã³ãããããããšãå®è£ ã¯æ°ããå€ã以åã«èšå®ãããå€ãšåãã§ãããã©ããããã§ãã¯ããŸããå€ã倿ŽãããŠããªãå Žåãå®è£ ã¯å®éã®æŽæ°æäœãã¹ãããã§ããGPUãšã®äžèŠãªéä¿¡ãåé¿ã§ããŸãããã®æé©åã¯ãåããããªã¢ã«ãå ±æããå€ãã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ããå Žåãããã£ãããšå€åããããããã£ãæã€ãªããžã§ã¯ããã¢ãã¡ãŒã·ã§ã³åããå Žåã«ç¹ã«å¹æçã§ãã
åãŠããã©ãŒã ãšå±æ§ã«å¯ŸããŠæåŸã«äœ¿çšãããå€ã®ã¡ã¢ãªã®ãããªãã®ã ãšèããŠãã ããããã§ã«ã¡ã¢ãªã«ããå€ãèšå®ããããšãããšãWebGLã¯ãããè³¢ãèªèããåãããŒã¿ãå床GPUã«éä¿¡ãããšããæœåšçã«ã³ã¹ãã®ãããã¹ããããã¹ãããããŸãããã®åçŽãªæé©åã¯ãç¹ã«è€éãªã·ãŒã³ã«ãããŠãé©ãã»ã©å€§ããªããã©ãŒãã³ã¹åäžã«ã€ãªããããšããããŸãã
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãéèŠãªçç±
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãéèŠã§ããäž»ãªçç±ã¯ãããã©ãŒãã³ã¹ãžã®åœ±é¿ã§ããäžèŠãªç¶æ 倿Žãåé¿ããããšã«ãããCPUãšGPUã®äž¡æ¹ã®ã¯ãŒã¯ããŒããåæžããã以äžã®å©ç¹ãåŸãããŸãïŒ
- ãã¬ãŒã ã¬ãŒãã®åäž: ãªãŒããŒãããã®åæžã¯ã¬ã³ããªã³ã°æéã®ççž®ã«ã€ãªãããããé«ããã¬ãŒã ã¬ãŒããšã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ããããããŸãã
- CPU䜿çšçã®äœäž: GPUãžã®äžèŠãªåŒã³åºããæžãããšã§ãCPUãªãœãŒã¹ãã²ãŒã ããžãã¯ãUIã®æŽæ°ãªã©ãä»ã®ã¿ã¹ã¯ã®ããã«è§£æŸãããŸãã
- æ¶è²»é»åã®åæž: GPUéä¿¡ãæå°éã«æããããšã¯ãç¹ã«ã¢ãã€ã«ããã€ã¹ã«ãšã£ãŠéèŠãªãæ¶è²»é»åã®åæžã«ã€ãªããå¯èœæ§ããããŸãã
è€éãªWebGLã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¶æ 倿Žã«é¢é£ãããªãŒããŒããããé倧ãªããã«ããã¯ã«ãªãããšããããŸããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãçè§£ããæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå¿çæ§ãå€§å¹ ã«åäžãããããšãã§ããŸãã
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã®å®éã®åäœ
WebGLã®å®è£ ã¯éåžžãããŒããŠã§ã¢ãšãœãããŠã§ã¢ã®æè¡ãçµã¿åãããŠã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãå®è£ ããŸããå ·äœçãªè©³çްã¯ç¹å®ã®GPUããã©ã€ãã®ããŒãžã§ã³ã«ãã£ãŠç°ãªããŸãããåºæ¬çãªååã¯åãã§ãã
以äžã«ããã®äžè¬çãªåäœã®ç°¡ç¥åãããæŠèŠã瀺ããŸãïŒ
- ç¶æ 远跡: WebGLã®å®è£ ã¯ããã¹ãŠã®ã·ã§ãŒããŒãŠããã©ãŒã ããã¯ã¹ãã£ãããã³ãã®ä»ã®é¢é£ããç¶æ 倿°ã®çŸåšã®å€ãèšé²ã»ç¶æããŸãã
- å€ã®æ¯èŒ: ç¶æ
倿°ãèšå®ãã颿°ïŒäŸïŒ
gl.uniform1f()ãgl.bindTexture()ïŒãåŒã³åºããšãå®è£ ã¯æ°ããå€ã以åã«ä¿åãããå€ãšæ¯èŒããŸãã - æ¡ä»¶ä»ãæŽæ°: æ°ããå€ãå€ãå€ãšç°ãªãå Žåãå®è£ ã¯GPUã®ç¶æ ãæŽæ°ããæ°ããå€ãå éšã¬ã³ãŒãã«ä¿åããŸããæ°ããå€ãå€ãå€ãšåãå Žåãå®è£ ã¯æŽæ°æäœãã¹ãããããŸãã
ãã®ããã»ã¹ã¯WebGLéçºè ã«ã¯ééçã§ããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãæç€ºçã«æå¹ãŸãã¯ç¡å¹ã«ããå¿ èŠã¯ãããŸãããããã¯WebGLã®å®è£ ã«ãã£ãŠèªåçã«åŠçãããŸãã
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã掻çšããããã®ãã¹ããã©ã¯ãã£ã¹
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯WebGLã®å®è£ ã«ãã£ãŠèªåçã«åŠçãããŸããããã®å¹æãæå€§åããããã«åããææ®µã¯ãŸã ãããŸãã以äžã«ãåŸãã¹ããã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãïŒ
1. äžèŠãªç¶æ 倿Žãæå°éã«æãã
æãéèŠãªããšã¯ãã¬ã³ããªã³ã°ã«ãŒãå ã§äžèŠãªç¶æ 倿Žã®æ°ãæå°éã«æããããšã§ããããã¯ãåããããªã¢ã«ããããã£ãå ±æãããªããžã§ã¯ããã°ã«ãŒãåããç°ãªããããªã¢ã«ã«åãæ¿ããåã«ãããããŸãšããŠã¬ã³ããªã³ã°ããããšãæå³ããŸããäŸãã°ãåãã·ã§ãŒããŒãšãã¯ã¹ãã£ã䜿çšããè€æ°ã®ãªããžã§ã¯ããããå ŽåãäžèŠãªã·ã§ãŒããŒãšãã¯ã¹ãã£ã®ãã€ã³ãåŒã³åºããé¿ããããã«ãããããé£ç¶ãããããã¯ã§ã¬ã³ããªã³ã°ããŸãã
äŸ: ãªããžã§ã¯ããäžã€ãã€ã¬ã³ããªã³ã°ããæ¯åãããªã¢ã«ãåãæ¿ãã代ããã«ïŒ
for (let i = 0; i < objects.length; i++) {
bindMaterial(objects[i].material);
drawObject(objects[i]);
}
ãããªã¢ã«ã§ãªããžã§ã¯ãããœãŒããããããã§ã¬ã³ããªã³ã°ããŸãïŒ
const sortedObjects = sortByMaterial(objects);
let currentMaterial = null;
for (let i = 0; i < sortedObjects.length; i++) {
const object = sortedObjects[i];
if (object.material !== currentMaterial) {
bindMaterial(object.material);
currentMaterial = object.material;
}
drawObject(object);
}
ãã®åçŽãªãœãŒãæé ã«ããããããªã¢ã«ãã€ã³ãåŒã³åºãã®æ°ãåçã«æžããããšãã§ããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ããã广çã«æ©èœããããã«ãªããŸãã
2. ãŠããã©ãŒã ãããã¯ã䜿çšãã
ãŠããã©ãŒã ãããã¯ã䜿çšãããšãé¢é£ãããŠããã©ãŒã 倿°ãåäžã®ãããã¯ã«ã°ã«ãŒãåããåäžã®gl.uniformBlockBinding()åŒã³åºãã§æŽæ°ã§ããŸããããã¯ãåã
ã®ãŠããã©ãŒã 倿°ãèšå®ãããããå¹ççã§ãããç¹ã«å€ãã®ãŠããã©ãŒã ãåäžã®ãããªã¢ã«ã«é¢é£ããŠããå Žåã«æå¹ã§ãã*ãã©ã¡ãŒã¿*ã®ãã£ãã·ã¥ã«çŽæ¥é¢é£ããããã§ã¯ãããŸãããããŠããã©ãŒã ãããã¯ã¯æç»åŒã³åºããšãŠããã©ãŒã æŽæ°ã®*æ°*ãæžãããããã«ãã£ãŠå
šäœçãªããã©ãŒãã³ã¹ãåäžãããæ®ãã®åŒã³åºãã«å¯ŸããŠãã©ã¡ãŒã¿ãã£ãã·ã¥ãããå¹ççã«æ©èœããããã«ããŸãã
äŸ: ã·ã§ãŒããŒã§ãŠããã©ãŒã ãããã¯ãå®çŸ©ããŸãïŒ
layout(std140) uniform MaterialBlock {
vec3 diffuseColor;
vec3 specularColor;
float shininess;
};
ãããŠãJavaScriptã³ãŒãã§ãããã¯ãæŽæ°ããŸãïŒ
const materialData = new Float32Array([
0.8, 0.2, 0.2, // diffuseColor
0.5, 0.5, 0.5, // specularColor
32.0 // shininess
]);
gl.bindBuffer(gl.UNIFORM_BUFFER, materialBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, materialData, gl.DYNAMIC_DRAW);
gl.bindBufferBase(gl.UNIFORM_BUFFER, materialBlockBindingPoint, materialBuffer);
3. ãããã¬ã³ããªã³ã°
ãããã¬ã³ããªã³ã°ã¯ãè€æ°ã®ãªããžã§ã¯ããåäžã®é ç¹ãããã¡ã«çµåããåäžã®æç»åŒã³åºãã§ã¬ã³ããªã³ã°ããããšãå«ã¿ãŸããããã«ãããæç»åŒã³åºãã«é¢é£ãããªãŒããŒããããåæžãããGPUããžãªã¡ããªãããå¹ççã«åŠçã§ããããã«ãªããŸããæ éãªãããªã¢ã«ç®¡çãšçµã¿åãããããšã§ããããã¬ã³ããªã³ã°ã¯ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
äŸ: åããããªã¢ã«ãæã€è€æ°ã®ãªããžã§ã¯ããåäžã®é ç¹é
åãªããžã§ã¯ãïŒVAOïŒãšã€ã³ããã¯ã¹ãããã¡ã«çµåããŸããããã«ãããåäžã®gl.drawElements()åŒã³åºãã§å
šãŠã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ã§ããç¶æ
倿Žãšæç»åŒã³åºãã®æ°ãæžããããšãã§ããŸãã
ãããåŠçã®å®è£ ã«ã¯æ éãªèšç»ãå¿ èŠã§ãããããã©ãŒãã³ã¹é¢ã§ã®å©ç¹ã¯ãç¹ã«å€ãã®é¡äŒŒãªããžã§ã¯ããæã€ã·ãŒã³ã§éåžžã«å€§ãããªãå¯èœæ§ããããŸããThree.jsãBabylon.jsã®ãããªã©ã€ãã©ãªã¯ãããåŠçã®ã¡ã«ããºã ãæäŸããŠãããããã»ã¹ã容æã«ããŸãã
4. ãããã¡ã€ãªã³ã°ãšæé©å
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã广çã«æŽ»çšããŠããããšã確èªããæåã®æ¹æ³ã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããç¶æ 倿Žãããã©ãŒãã³ã¹ã®ããã«ããã¯ãåŒãèµ·ãããŠããé åãç¹å®ããããšã§ãããã©ãŠã¶ã®éçºè ããŒã«ã䜿çšããŠã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãåæããæãã³ã¹ãã®ãããæäœãç¹å®ããŸããChrome DevToolsïŒããã©ãŒãã³ã¹ã¿ãïŒãFirefox Developer Toolsã¯ãããã«ããã¯ã®ç¹å®ãGPUã¢ã¯ãã£ããã£ã®åæã«éåžžã«åœ¹ç«ã¡ãŸãã
æç»åŒã³åºãã®æ°ãç¶æ 倿Žã®é »åºŠãé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã§è²»ããããæéã«æ³šæãæã£ãŠãã ãããããã«ããã¯ãç¹å®ãããããããã®ç¹å®ã®é åã®æé©åã«éäžã§ããŸãã
5. åé·ãªãŠããã©ãŒã æŽæ°ãé¿ãã
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãæ©èœããŠããŠãããã¬ãŒã ããšã«äžèŠã«åããŠããã©ãŒã å€ãèšå®ãããšãäŸç¶ãšããŠãªãŒããŒããããçºçããŸãããŠããã©ãŒã ã¯ããã®å€ãå®éã«å€æŽããããšãã«ã®ã¿æŽæ°ããŠãã ãããäŸãã°ãã©ã€ãã®äœçœ®ãåããŠããªãå Žåããã®äœçœ®ããŒã¿ãå床ã·ã§ãŒããŒã«éä¿¡ããªãã§ãã ããã
äŸ:
let lastLightPosition = null;
function render() {
const currentLightPosition = getLightPosition();
if (currentLightPosition !== lastLightPosition) {
gl.uniform3fv(lightPositionUniform, currentLightPosition);
lastLightPosition = currentLightPosition;
}
// ... rest of rendering code
}
6. ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã䜿çšãã
ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã䜿çšãããšãåããžãªã¡ããªã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ããç°ãªã屿§ïŒäŸïŒäœçœ®ãå転ãã¹ã±ãŒã«ïŒã§åäžã®æç»åŒã³åºãã§æç»ã§ããŸããããã¯ãæ£®ã®æšã ãã·ãã¥ã¬ãŒã·ã§ã³ã®ããŒãã£ã¯ã«ãªã©ã倿°ã®åäžãªããžã§ã¯ããã¬ã³ããªã³ã°ããå Žåã«ç¹ã«äŸ¿å©ã§ããã€ã³ã¹ã¿ã³ã¹åã«ãããæç»åŒã³åºããšç¶æ 倿Žãåçã«æžããããšãã§ããŸããããã¯ãé ç¹å±æ§ãä»ããŠã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ãæäŸããããšã§æ©èœããŸãã
äŸ: åæšãåå¥ã«æç»ãã代ããã«ãåäžã®æšã¢ãã«ãå®çŸ©ããã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã䜿çšããŠç°ãªãå Žæã«ãã®æšã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãæç»ã§ããŸãã
7. é«é »åºŠããŒã¿ã«ã¯ãŠããã©ãŒã ã®ä»£æ¿æ¡ãæ€èšãã
ãŠããã©ãŒã ã¯å€ãã®ã·ã§ãŒããŒãã©ã¡ãŒã¿ã«é©ããŠããŸãããé ç¹ããšã®ã¢ãã¡ãŒã·ã§ã³ããŒã¿ãªã©ãæ¥éã«å€åããããŒã¿ãã·ã§ãŒããŒã«æž¡ãããã®æãå¹ççãªæ¹æ³ã§ã¯ãªãå ŽåããããŸãããã®ãããªå Žåãé ç¹å±æ§ããã¯ã¹ãã£ã䜿çšããŠããŒã¿ãæž¡ãããšãæ€èšããŠãã ãããé ç¹å±æ§ã¯é ç¹ããšã®ããŒã¿çšã«èšèšãããŠãããå€§èŠæš¡ãªããŒã¿ã»ããã«å¯ŸããŠã¯ãŠããã©ãŒã ãããå¹ççã§ãããã¯ã¹ãã£ã¯ä»»æã®ããŒã¿ãæ ŒçŽããããã«äœ¿çšã§ããã·ã§ãŒããŒã§ãµã³ããªã³ã°ã§ãããããè€éãªããŒã¿æ§é ãæž¡ãããã®æè»ãªæ¹æ³ãæäŸããŸãã
ã±ãŒã¹ã¹ã¿ãã£ãšäŸ
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãç°ãªãã·ããªãªã§ããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ãäžããããããã€ãã®å®è·µçãªäŸãèŠãŠã¿ãŸãããïŒ
1. å€ãã®åäžãªããžã§ã¯ããæã€ã·ãŒã³ã®ã¬ã³ããªã³ã°
æ°åã®åäžã®ãã¥ãŒããããããããããç¬èªã®äœçœ®ãšåããæã€ã·ãŒã³ãèããŠã¿ãŸããããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ããªããã°ãåãã¥ãŒãã¯åå¥ã®æç»åŒã³åºããå¿ èŠãšããããããã«ç¬èªã®ãŠããã©ãŒã æŽæ°ã»ãããå¿ èŠã«ãªããŸããããã«ããã倿°ã®ç¶æ 倿Žãçºçããããã©ãŒãã³ã¹ãäœäžããŸããããããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãšã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã䜿çšãããšããããã®ãã¥ãŒãã¯åäžã®æç»åŒã³åºãã§ã¬ã³ããªã³ã°ã§ããåãã¥ãŒãã®äœçœ®ãšåãã¯ã€ã³ã¹ã¿ã³ã¹å±æ§ãšããŠæž¡ãããŸããããã«ããããªãŒããŒããããå€§å¹ ã«åæžãããããã©ãŒãã³ã¹ãåäžããŸãã
2. è€éãªã¢ãã«ã®ã¢ãã¡ãŒã·ã§ã³
è€éãªã¢ãã«ãã¢ãã¡ãŒã·ã§ã³åããã«ã¯ããã¬ãŒã ããšã«å€æ°ã®ãŠããã©ãŒã 倿°ãæŽæ°ããããšããããããŸããã¢ãã«ã®ã¢ãã¡ãŒã·ã§ã³ãæ¯èŒçãªããããªå Žåããããã®ãŠããã©ãŒã 倿°ã®å€ãã¯ãã¬ãŒã éã§ãããã«ããå€åããŸãããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã䜿çšãããšãWebGLã®å®è£ ã¯å€æŽãããŠããªããŠããã©ãŒã ã®æŽæ°ãã¹ãããã§ããããããªãŒããŒããããåæžãããããã©ãŒãã³ã¹ãåäžããŸãã
3. å®äžçã®å¿çšïŒå°åœ¢ã¬ã³ããªã³ã°
å°åœ¢ã¬ã³ããªã³ã°ã§ã¯ã颚æ¯ã衚çŸããããã«å€æ°ã®äžè§åœ¢ãæç»ããããšããããããŸããå¹ççãªå°åœ¢ã¬ã³ããªã³ã°æè¡ã¯ã詳现ã¬ãã«ïŒLODïŒã®ãããªæè¡ã䜿çšããŠãé æ¹ã§ã¬ã³ããªã³ã°ãããäžè§åœ¢ã®æ°ãæžãããŸãããããã®æè¡ãã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ãæ éãªãããªã¢ã«ç®¡çãšçµã¿åãããããšã§ãäœã¹ããã¯ã®ããã€ã¹ã§ãæ»ããã§ãªã¢ã«ãªå°åœ¢ã¬ã³ããªã³ã°ãå¯èœã«ãªããŸãã
4. ã°ããŒãã«ãªäŸïŒããŒãã£ã«ãã¥ãŒãžã¢ã ãã¢ãŒ
äžçäžããã¢ã¯ã»ã¹å¯èœãªããŒãã£ã«ãã¥ãŒãžã¢ã ãã¢ãŒãæ³åããŠã¿ãŠãã ãããåå±ç€ºç©ã¯ç°ãªãã·ã§ãŒããŒããã¯ã¹ãã£ã䜿çšãããããããŸãããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã§æé©åããããšã§ããŠãŒã¶ãŒã®ããã€ã¹ãã€ã³ã¿ãŒãããæ¥ç¶ã«é¢ããããã¹ã ãŒãºãªäœéšãä¿èšŒãããŸããã¢ã»ãããäºåã«ããŒãããå±ç€ºç©éãç§»è¡ããéã®ç¶æ 倿Žãæ éã«ç®¡çããããšã§ãéçºè ã¯äžçäžã®ãŠãŒã¶ãŒã«ã·ãŒã ã¬ã¹ã§æ²¡å ¥æã®ããäœéšãæäŸã§ããŸãã
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã®å¶é
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯è²Žéãªæé©åæè¡ã§ãããäžèœè¬ã§ã¯ãããŸãããæ³šæãã¹ãããã€ãã®å¶éããããŸãïŒ
- ãã©ã€ããŒåºæã®åäœ: ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã®æ£ç¢ºãªåäœã¯ãGPUãã©ã€ããŒããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠç°ãªãå ŽåããããŸããããã¯ããããã©ãããã©ãŒã ã§ããŸãæ©èœããããã©ãŒãã³ã¹æé©åããå¥ã®ãã©ãããã©ãŒã ã§ã¯ããã»ã©å¹æçã§ãªãå¯èœæ§ãããããšãæå³ããŸãã
- è€éãªç¶æ 倿Ž: ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯ãç¶æ 倿Žãæ¯èŒçé »ç¹ã§ãªãå Žåã«æã广çã§ããåžžã«ç°ãªãã·ã§ãŒããŒããã¯ã¹ãã£ãã¬ã³ããŒç¶æ ãåãæ¿ããŠããå Žåããã£ãã·ã¥ã®å©ç¹ã¯éå®çãããããŸããã
- å°ããªãŠããã©ãŒã æŽæ°: éåžžã«å°ããªãŠããã©ãŒã æŽæ°ïŒäŸïŒåäžã®floatå€ïŒã®å Žåããã£ãã·ã¥ããã§ãã¯ãããªãŒããŒãããããæŽæ°æäœãã¹ãããããå©ç¹ãäžåãå¯èœæ§ããããŸãã
ãã©ã¡ãŒã¿ãã£ãã·ã¥ãè¶ ããŠïŒãã®ä»ã®WebGLæé©åæè¡
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯ãWebGLã®ããã©ãŒãã³ã¹ãæé©åããäžã§ã®ããºã«ã®äžçã«ãããŸãããèæ ®ãã¹ãä»ã®éèŠãªæè¡ãããã€ã玹ä»ããŸãïŒ
- å¹ççãªã·ã§ãŒããŒã³ãŒã: èšç®ãšãã¯ã¹ãã£ã«ãã¯ã¢ããã®æ°ãæå°éã«æãããæé©åãããã·ã§ãŒããŒã³ãŒããèšè¿°ããŸãã
- ãã¯ã¹ãã£ã®æé©å: å§çž®ãã¯ã¹ãã£ãããããããã䜿çšããŠããã¯ã¹ãã£ã¡ã¢ãªã®äœ¿çšéãåæžããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãåäžãããŸãã
- ãžãªã¡ããªã®æé©å: ãžãªã¡ããªãç°¡çŽ åãã詳现ã¬ãã«ïŒLODïŒãªã©ã®æè¡ã䜿çšããŠãã¬ã³ããªã³ã°ãããäžè§åœ¢ã®æ°ãæžãããŸãã
- ãªã¯ã«ãŒãžã§ã³ã«ãªã³ã°: ä»ã®ãªããžã§ã¯ãã®åŸãã«é ããŠãããªããžã§ã¯ãã®ã¬ã³ããªã³ã°ãé¿ããŸãã
- éåæèªã¿èŸŒã¿: ã¡ã€ã³ã¹ã¬ããããããã¯ããªãããã«ãã¢ã»ãããéåæã§èªã¿èŸŒã¿ãŸãã
çµè«
ã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ãã匷åãªæé©åæè¡ã§ãããã®ä»çµã¿ãçè§£ãããã®èšäºã§æŠèª¬ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãããã¹ã ãŒãºã§ãããéããããå¿çæ§ã®é«ãWebããŒã¹ã®ã°ã©ãã£ãã¯ã¹äœéšãåµé ããããã«æŽ»çšã§ããŸããã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããããã«ããã¯ãç¹å®ããäžèŠãªç¶æ 倿Žãæå°éã«æããããšã«éäžããããšãå¿ããªãã§ãã ãããä»ã®æé©åæè¡ãšçµã¿åãããããšã§ãã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯WebGLã§å¯èœãªããšã®éçãæŒãäžããã®ã«åœ¹ç«ã¡ãŸãã
ãããã®æŠå¿µãšæè¡ãé©çšããããšã§ãäžçäžã®éçºè ã¯ãã¿ãŒã²ãããªãŒãã£ãšã³ã¹ã®ããŒããŠã§ã¢ãã€ã³ã¿ãŒãããæ¥ç¶ã«é¢ããããããå¹ççã§é åçãªWebGLã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«æé©åãããšããããšã¯ãå¹ åºãããã€ã¹ãšãããã¯ãŒã¯æ¡ä»¶ãèæ ®ããããšãæå³ããã·ã§ãŒããŒãã©ã¡ãŒã¿ãã£ãã·ã¥ã¯ãã®ç®æšãéæããããã®éèŠãªããŒã«ã§ãã