åçãªãµãŒãã§ã¹ãã£ããŒã«ç®¡çã®ããã®WebGLãžãªã¡ããªããã»ã¬ãŒã·ã§ã³å¶åŸ¡ãæ¢æ±ããããçæãã·ã§ãŒããŒãé©å¿çåå²ãããã©ãŒãã³ã¹æé©åã«ã€ããŠåŠã³ãå§å·»ã®ããžã¥ã¢ã«ãå®çŸããŸãã
WebGLãžãªã¡ããªããã»ã¬ãŒã·ã§ã³å¶åŸ¡ïŒãµãŒãã§ã¹ãã£ããŒã«ç®¡çã®ç¿åŸ
ãªã¢ã«ã¿ã€ã 3Dã°ã©ãã£ãã¯ã¹ã®é åã§ã¯ãããã©ãŒãã³ã¹ãç ç²ã«ããããšãªãé«ãã¬ãã«ã®èŠèŠçå¿ å®åºŠãéæããããšã¯ãçµ¶ãéãªã課é¡ã§ãã WebGLã¯ããŠã§ããã©ãŠã¶å ã§ã€ã³ã¿ã©ã¯ãã£ããª2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®åŒ·åãªAPIãšããŠããã®èª²é¡ã«å¯ŸåŠããããã®ããŸããŸãªæè¡ãæäŸããŠããŸããç¹ã«åŒ·åãªæè¡ã®1ã€ããžãªã¡ããªããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã§ãããã®ããã°èšäºã§ã¯ãWebGLãžãªã¡ããªããã»ã¬ãŒã·ã§ã³ã®è€éããæãäžãããã®äžå¿çãªæŠå¿µãå®çšçãªå¿çšãããã³æé©åæŠç¥ãæ¢ããŸãã ããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã«ãã£ãŠãéçºè ããµãŒãã§ã¹ã®è©³çްã¬ãã«ïŒLODïŒãåçã«èª¿æŽããäžçäžã®ããŸããŸãªããã€ã¹ããããã¯ãŒã¯æ¡ä»¶äžã§ã¹ã ãŒãºã§å¿çæ§ã®é«ãããã©ãŒãã³ã¹ãç¶æããªãããèŠèŠçã«èŠäºãªçµæãçã¿åºãæ¹æ³ãæ€èšŒããŸãã
ãžãªã¡ããªããã»ã¬ãŒã·ã§ã³ã®çè§£
ãžãªã¡ããªããã»ã¬ãŒã·ã§ã³ã¯ããµãŒãã§ã¹ãããå°ããªããªããã£ãïŒéåžžã¯äžè§åœ¢ïŒã«çްååããããã»ã¹ã§ãã ãã®çްååã«ãããæ¯èŒçç²ãåæã¡ãã·ã¥ãããããè©³çŽ°ã§æ»ãããªãµãŒãã§ã¹ãäœæã§ããŸãã åŸæ¥ã®ã¢ãããŒãã§ã¯ã詳现ã¬ãã«ãåºå®ãããäºåããã»ã¬ãŒã·ã§ã³ã¡ãã·ã¥ã䜿çšãããŠããŸãããããããããã§ã¯é«ã詳现床ãå¿ èŠãªãé åã§äžèŠãªåŠçãšã¡ã¢ãªäœ¿çšéãçºçããå¯èœæ§ããããŸããã WebGLã®ãžãªã¡ããªããã»ã¬ãŒã·ã§ã³ã¯ãããã»ã¬ãŒã·ã§ã³ããã»ã¹ãåçã«ã©ã³ã¿ã€ã ã§å¶åŸ¡ã§ããããã«ããããšã§ãããæè»ã§å¹ççãªã¢ãããŒããæäŸããŸãã
ããã»ã¬ãŒã·ã§ã³ãã€ãã©ã€ã³
WebGLã®ããã»ã¬ãŒã·ã§ã³ãã€ãã©ã€ã³ã«ã¯ã2ã€ã®æ°ããã·ã§ãŒããŒã¹ããŒãžãå°å ¥ãããŠããŸãïŒ
- ããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒïŒTCSïŒïŒ ãã®ã·ã§ãŒããŒã¯ããµãŒãã§ã¹ãå®çŸ©ããé ç¹ã®éåã§ãããããã«å¯ŸããŠåäœããŸãã TCSã¯ããããã«é©çšãã¹ã现ååã®æ°ã決å®ããããã»ã¬ãŒã·ã§ã³ä¿æ°ã決å®ããŸãããŸãããããå ã®é ç¹å±æ§ã倿Žããããšãã§ããŸãã
- ããã»ã¬ãŒã·ã§ã³è©äŸ¡ã·ã§ãŒããŒïŒTESïŒïŒ ãã®ã·ã§ãŒããŒã¯ãããã»ã¬ãŒã·ã§ã³ä¿æ°ã«ãã£ãŠæ±ºå®ããã现ååãããç¹ã§ãµãŒãã§ã¹ãè©äŸ¡ããŸãã æ°ããçæãããé ç¹ã®æçµçãªäœçœ®ããã®ä»ã®å±æ§ãèšç®ããŸãã
ããã»ã¬ãŒã·ã§ã³ãã€ãã©ã€ã³ã¯ãé ç¹ã·ã§ãŒããŒãšãžãªã¡ããªã·ã§ãŒããŒïŒãŸãã¯ãžãªã¡ããªã·ã§ãŒããŒãååšããªãå Žåã¯ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒã®éã«äœçœ®ããŸããããã«ãããé ç¹ã·ã§ãŒããŒã¯æ¯èŒçäœè§£å床ã®ã¡ãã·ã¥ãåºåããããã»ã¬ãŒã·ã§ã³ãã€ãã©ã€ã³ããããåçã«æŽç·Žãããããšãã§ããŸãã ãã€ãã©ã€ã³ã¯ä»¥äžã®ã¹ããŒãžã§æ§æãããŸãïŒ
- é ç¹ã·ã§ãŒããŒïŒ å ¥åé ç¹ã倿ããæºåããŸãã
- ããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒïŒ ããã»ã¬ãŒã·ã§ã³ä¿æ°ãèšç®ãããããé ç¹ã倿ŽããŸãã
- ããã»ã¬ãŒã·ã§ã³ãšã³ãžã³ïŒ ããã»ã¬ãŒã·ã§ã³ä¿æ°ã«åºã¥ããŠãããã现ååããŸããããã¯GPUå ã®åºå®æ©èœã¹ããŒãžã§ãã
- ããã»ã¬ãŒã·ã§ã³è©äŸ¡ã·ã§ãŒããŒïŒ æçµçãªé ç¹ã®äœçœ®ãšå±æ§ãèšç®ããŸãã
- ãžãªã¡ããªã·ã§ãŒããŒïŒãªãã·ã§ã³ïŒïŒ ããã»ã¬ãŒã·ã§ã³ããããžãªã¡ããªãããã«åŠçããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒ åŠçããããžãªã¡ããªã«åºã¥ããŠãã¯ã»ã«ãçè²ããŸãã
äž»èŠãªæŠå¿µãšçšèª
WebGLããã»ã¬ãŒã·ã§ã³ã广çã«å©çšããããã«ã¯ã以äžã®äž»èŠãªæŠå¿µãçè§£ããããšãäžå¯æ¬ ã§ãïŒ
- ãããïŒ ãµãŒãã§ã¹ãå®çŸ©ããé ç¹ã®éåã§ãã ãããå ã®é ç¹æ°ã¯ `gl.patchParameteri(gl.PATCHES, gl.PATCH_VERTICES, numVertices)` 颿°åŒã³åºãã«ãã£ãŠæ±ºå®ãããŸãã äžè¬çãªãããã¿ã€ãã«ã¯ãäžè§åœ¢ïŒ3é ç¹ïŒãåè§åœ¢ïŒ4é ç¹ïŒãããžã§ããããªã©ããããŸãã
- ããã»ã¬ãŒã·ã§ã³ä¿æ°ïŒ ãããã«é©çšããã现ååã®éãå¶åŸ¡ããå€ã§ãã ãããã®ä¿æ°ã¯ããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒã«ãã£ãŠåºåãããŸãã ããã»ã¬ãŒã·ã§ã³ä¿æ°ã«ã¯2ã€ã®ã¿ã€ãããããŸãïŒ
- å éšããã»ã¬ãŒã·ã§ã³ä¿æ°ïŒ ãããã®å éšã«æ²¿ã£ã现ååãå¶åŸ¡ããŸããå éšããã»ã¬ãŒã·ã§ã³ä¿æ°ã®æ°ã¯ãããã¿ã€ãã«äŸåããŸãïŒäŸïŒåè§åœ¢ã«ã¯åæ¹åã«1ã€ãã€ãåèš2ã€ã®å éšããã»ã¬ãŒã·ã§ã³ä¿æ°ããããŸãïŒã
- å€éšããã»ã¬ãŒã·ã§ã³ä¿æ°ïŒ ãããã®ãšããžã«æ²¿ã£ã现ååãå¶åŸ¡ããŸãã å€éšããã»ã¬ãŒã·ã§ã³ä¿æ°ã®æ°ã¯ãããã®ãšããžã®æ°ãšçãããªããŸãã
- ããã»ã¬ãŒã·ã§ã³ã¬ãã«ïŒ ãµãŒãã§ã¹ã«å®éã«é©çšããã现ååã®æ°ã§ãããããã®ã¬ãã«ã¯ããã»ã¬ãŒã·ã§ã³ä¿æ°ããå°åºãããããã»ã¬ãŒã·ã§ã³ãšã³ãžã³ã«ãã£ãŠäœ¿çšãããŸãã ããã»ã¬ãŒã·ã§ã³ã¬ãã«ãé«ãã»ã©ããã詳现ãªãµãŒãã§ã¹ã«ãªããŸãã
- ãã¡ã€ã³ïŒ ããã»ã¬ãŒã·ã§ã³è©äŸ¡ã·ã§ãŒããŒãåäœãããã©ã¡ããªãã¯ç©ºéã§ãã äŸãã°ãåè§åœ¢ãããã¯2次å ïŒu, vïŒãã¡ã€ã³ã䜿çšããäžè§åœ¢ãããã¯éå¿åº§æšã䜿çšããŸãã
WebGLã§ã®ããã»ã¬ãŒã·ã§ã³å®è£ ïŒã¹ããããã€ã¹ãããã¬ã€ã
WebGLã§ããã»ã¬ãŒã·ã§ã³ãå®è£ ããæé ããããã»ã¹ã説æããããã®ã³ãŒãã¹ãããããšãšãã«æŠèª¬ããŸãã
1. WebGLã³ã³ããã¹ãã®ã»ããã¢ãã
ãŸããWebGLã³ã³ããã¹ããäœæããå¿ èŠãªæ¡åŒµæ©èœãã»ããã¢ããããŸãã `GL_EXT_tessellation` æ¡åŒµæ©èœããµããŒããããŠããããšã確èªããŠãã ããã
const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl2');
if (!gl) {
console.error('WebGL2 not supported.');
}
const ext = gl.getExtension('GL_EXT_tessellation');
if (!ext) {
console.error('GL_EXT_tessellation not supported.');
}
2. ã·ã§ãŒããŒã®äœæãšã³ã³ãã€ã«
é ç¹ã·ã§ãŒããŒãããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒãããã»ã¬ãŒã·ã§ã³è©äŸ¡ã·ã§ãŒããŒããã©ã°ã¡ã³ãã·ã§ãŒããŒãäœæããŸããåã·ã§ãŒããŒã¯ããã»ã¬ãŒã·ã§ã³ãã€ãã©ã€ã³ã§ç¹å®ã®ã¿ã¹ã¯ãå®è¡ããŸãã
é ç¹ã·ã§ãŒããŒ
é ç¹ã·ã§ãŒããŒã¯ãé ç¹äœçœ®ã次ã®ã¹ããŒãžã«æž¡ãã ãã§ãã
#version 300 es
in vec3 a_position;
out vec3 v_position;
void main() {
v_position = a_position;
gl_Position = vec4(a_position, 1.0);
}
ããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒ
ããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒã¯ããã»ã¬ãŒã·ã§ã³ä¿æ°ãèšç®ããŸãããã®äŸã§ã¯å®æ°ã®ããã»ã¬ãŒã·ã§ã³ä¿æ°ãèšå®ããŠããŸãããå®éã«ã¯ãã«ã¡ã©ãŸã§ã®è·é¢ããµãŒãã§ã¹ã®æ²çãªã©ã®èŠå ã«åºã¥ããŠããããã®ä¿æ°ã¯åçã«èª¿æŽãããŸãã
#version 300 es
#extension GL_EXT_tessellation : require
layout (vertices = 4) out;
in vec3 v_position[];
out vec3 tc_position[];
out float te_levelInner;
out float te_levelOuter[];
void main() {
tc_position[gl_InvocationID] = v_position[gl_InvocationID];
te_levelInner = 5.0;
te_levelOuter[0] = 5.0;
te_levelOuter[1] = 5.0;
te_levelOuter[2] = 5.0;
te_levelOuter[3] = 5.0;
gl_TessLevelInner[0] = te_levelInner;
gl_TessLevelOuter[0] = te_levelOuter[0];
gl_TessLevelOuter[1] = te_levelOuter[1];
gl_TessLevelOuter[2] = te_levelOuter[2];
gl_TessLevelOuter[3] = te_levelOuter[3];
}
ããã»ã¬ãŒã·ã§ã³è©äŸ¡ã·ã§ãŒããŒ
ããã»ã¬ãŒã·ã§ã³è©äŸ¡ã·ã§ãŒããŒã¯ãããã»ã¬ãŒã·ã§ã³ããã座æšã«åºã¥ããŠæçµçãªé ç¹äœçœ®ãèšç®ããŸãããã®äŸã§ã¯ãåçŽãªç·åœ¢è£éãå®è¡ããŸãã
#version 300 es
#extension GL_EXT_tessellation : require
layout (quads, equal_spacing, cw) in;
in vec3 tc_position[];
out vec3 te_position;
void main() {
float u = gl_TessCoord.x;
float v = gl_TessCoord.y;
vec3 p0 = tc_position[0];
vec3 p1 = tc_position[1];
vec3 p2 = tc_position[2];
vec3 p3 = tc_position[3];
vec3 p01 = mix(p0, p1, u);
vec3 p23 = mix(p2, p3, u);
te_position = mix(p01, p23, v);
gl_Position = vec4(te_position, 1.0);
}
ãã©ã°ã¡ã³ãã·ã§ãŒããŒ
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ãã¯ã»ã«ãçè²ããŸãã
#version 300 es
precision highp float;
out vec4 fragColor;
void main() {
fragColor = vec4(1.0, 0.0, 0.0, 1.0); // Red
}
ãããã®ã·ã§ãŒããŒãã³ã³ãã€ã«ããWebGLããã°ã©ã ã«ãªã³ã¯ããŸããã·ã§ãŒããŒã®ã³ã³ãã€ã«ããã»ã¹ã¯WebGLã®æšæºçãªãã®ã§ãã
3. é ç¹ãããã¡ãšå±æ§ã®ã»ããã¢ãã
é ç¹ãããã¡ãäœæãããããã®é ç¹ãããŒãããŸãããããã®é ç¹ã¯ãµãŒãã§ã¹ã®å¶åŸ¡ç¹ãå®çŸ©ããŸãã`gl.patchParameteri` ãåŒã³åºããŠãããããããã®é ç¹æ°ãèšå®ããããšãå¿ããªãã§ãã ãããåè§åœ¢ãããã®å Žåããã®å€ã¯4ã§ãã
const vertices = new Float32Array([
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.5, 0.5, 0.0,
-0.5, 0.5, 0.0
]);
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
const positionAttribLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttribLocation);
gl.vertexAttribPointer(positionAttribLocation, 3, gl.FLOAT, false, 0, 0);
gl.patchParameteri(gl.PATCHES, gl.PATCH_VERTICES, 4); // 4 vertices for a quad patch
4. ããã»ã¬ãŒã·ã§ã³ããããµãŒãã§ã¹ã®ã¬ã³ããªã³ã°
æåŸã«ã`gl.drawArrays` 颿°ãš `gl.PATCHES` ããªããã£ãã¿ã€ãã䜿çšããŠãããã»ã¬ãŒã·ã§ã³ããããµãŒãã§ã¹ãã¬ã³ããªã³ã°ããŸãã
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.enableVertexAttribArray(positionAttribLocation);
gl.vertexAttribPointer(positionAttribLocation, 3, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.PATCHES, 0, 4); // 4 vertices in the quad patch
é©å¿ããã»ã¬ãŒã·ã§ã³ïŒLODã®åç調æŽ
ããã»ã¬ãŒã·ã§ã³ã®çã®åã¯ãããŸããŸãªèŠå ã«åºã¥ããŠè©³çްã¬ãã«ãåçã«èª¿æŽããèœåã«ãããŸããããã¯é©å¿ããã»ã¬ãŒã·ã§ã³ãšããŠç¥ãããŠããŸãã以äžã«äžè¬çãªææ³ãããã€ã玹ä»ããŸãïŒ
è·é¢ããŒã¹ã®ããã»ã¬ãŒã·ã§ã³
ãªããžã§ã¯ããã«ã¡ã©ã«è¿ããšãã¯ããã»ã¬ãŒã·ã§ã³ã¬ãã«ãäžããé ããšãã¯äžããŸããããã¯ãã«ã¡ã©ã®äœçœ®ãããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒã«æž¡ããåé ç¹ãŸã§ã®è·é¢ãèšç®ããããšã§å®è£ ã§ããŸãã
#version 300 es
#extension GL_EXT_tessellation : require
layout (vertices = 4) out;
in vec3 v_position[];
out vec3 tc_position[];
uniform vec3 u_cameraPosition;
void main() {
tc_position[gl_InvocationID] = v_position[gl_InvocationID];
float distance = length(u_cameraPosition - v_position[gl_InvocationID]);
float tessLevel = clamp(10.0 - distance, 1.0, 10.0);
gl_TessLevelInner[0] = tessLevel;
gl_TessLevelOuter[0] = tessLevel;
gl_TessLevelOuter[1] = tessLevel;
gl_TessLevelOuter[2] = tessLevel;
gl_TessLevelOuter[3] = tessLevel;
}
æ²çããŒã¹ã®ããã»ã¬ãŒã·ã§ã³
æ²çã®é«ãé åã§ã¯ããã»ã¬ãŒã·ã§ã³ã¬ãã«ãäžããå¹³åŠãªé åã§ã¯äžããŸããããã¯ãããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒã§ãµãŒãã§ã¹ã®æ²çãèšç®ããããã«å¿ããŠããã»ã¬ãŒã·ã§ã³ä¿æ°ã調æŽããããšã§å®è£ ã§ããŸãã
TCSã§çŽæ¥æ²çãèšç®ããã®ã¯è€éãªå ŽåããããŸããããç°¡åãªã¢ãããŒãã¯ãäºåã«ãµãŒãã§ã¹ã®æ³ç·ãèšç®ããé ç¹å±æ§ãšããŠä¿åããããšã§ããTCSã¯ã飿¥ããé ç¹ã®æ³ç·ãæ¯èŒããããšã§æ²çãæšå®ã§ããŸããæ³ç·ãæ¥æ¿ã«å€åããé åã¯ãé«ãæ²çã瀺ããŸãã
ã·ã«ãšããããŒã¹ã®ããã»ã¬ãŒã·ã§ã³
ãªããžã§ã¯ãã®ã·ã«ãšãããšããžã«æ²¿ã£ãŠããã»ã¬ãŒã·ã§ã³ã¬ãã«ãäžããŸããããã¯ãããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒã§ãµãŒãã§ã¹æ³ç·ãšãã¥ãŒãã¯ãã«ã®å ç©ãèšç®ããããšã§å®è£ ã§ããŸããå ç©ããŒãã«è¿ãå Žåããã®ãšããžã¯ã·ã«ãšãããšããžã§ããå¯èœæ§ãé«ãã§ãã
ããã»ã¬ãŒã·ã§ã³ã®å®çšçãªå¿çš
ãžãªã¡ããªããã»ã¬ãŒã·ã§ã³ã¯ãããŸããŸãªæ¥çã§èŠèŠçãªå質ãšããã©ãŒãã³ã¹ãåäžãããããã«ãå¹ åºãã·ããªãªã§å¿çšãããŠããŸãã
å°åœ¢ã¬ã³ããªã³ã°
ããã»ã¬ãŒã·ã§ã³ã¯ãåºå€§ã§è©³çްãªå°åœ¢ã®ã¬ã³ããªã³ã°ã«ç¹ã«åœ¹ç«ã¡ãŸããé©å¿ããã»ã¬ãŒã·ã§ã³ã䜿çšãããšãã«ã¡ã©ã«è¿ãéšåã®è©³çŽ°åºŠãäžããé ãã®éšåã®è©³çŽ°åºŠãäžããããšã§ãããã©ãŒãã³ã¹ãæé©åã§ããŸãã ã°ããŒãã«ãããã³ã°ã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŸããããããã»ã¬ãŒã·ã§ã³ã䜿çšãããšããŠãŒã¶ãŒã®ãºãŒã ã¬ãã«ãèŠéè§ã«åºã¥ããŠé«è§£å床ã®å°åœ¢ããŒã¿ãåçã«ã¹ããªãŒãã³ã°ããã³ã¬ã³ããªã³ã°ã§ããŸãã ããã«ãããã·ã¹ãã ã®è³æºãå§è¿«ããããšãªããèŠèŠçã«è±ããªäœéšãä¿èšŒãããŸãã
ãã£ã©ã¯ã¿ãŒã¢ãã¡ãŒã·ã§ã³
ããã»ã¬ãŒã·ã§ã³ã¯ãããæ»ããã§ãªã¢ã«ãªãã£ã©ã¯ã¿ãŒã¢ãã«ãäœæããããã«äœ¿çšã§ããŸãã åžããã®ä»ã®å€åœ¢å¯èœãªãµãŒãã§ã¹ã®ã·ãã¥ã¬ãŒã·ã§ã³ã«ç¹ã«æå¹ã§ãã äŸãã°ããªã¢ã«ãªã²ãŒã ç°å¢ã§ã¯ããã£ã©ã¯ã¿ãŒã®è¡£æïŒã·ã£ãããã³ããªã©ïŒãæ¯èŒçäœè§£å床ã®ã¡ãã·ã¥ã§ã¢ããªã³ã°ã§ããŸãã ãã®åŸãããã»ã¬ãŒã·ã§ã³ãé©çšããŠããã£ã©ã¯ã¿ãŒã®åãã«ãªã¢ã«ã«åå¿ãããããæãç®ã埮åŠãªãã£ããŒã«ã远å ã§ããŸãã
ããã·ãŒãžã£ã«çæ
ããã»ã¬ãŒã·ã§ã³ã¯ããã·ãŒãžã£ã«çææè¡ãšçµã¿åãããããšã§ãè€éã§éåžžã«è©³çްãªã·ãŒã³ãäœæã§ããŸããäŸãã°ãããã·ãŒãžã£ã«ãªæš¹æšçæã·ã¹ãã ã§ã¯ãããã»ã¬ãŒã·ã§ã³ã䜿çšããŠæãèã«ãã£ããŒã«ã远å ã§ããŸãããã®ã¢ãããŒãã¯ããªã¢ã«ãªæ€ç©ãå°åœ¢ãæã€åºå€§ã§å€æ§ãªã²ãŒã ã¯ãŒã«ããä»®æ³ç°å¢ãäœæããéã«ãã䜿ãããŸãã
CAD/CAMã¢ããªã±ãŒã·ã§ã³
ããã»ã¬ãŒã·ã§ã³ã¯ãè€éãªCADã¢ãã«ããªã¢ã«ã¿ã€ã ã§èŠèŠåããããã«äžå¯æ¬ ã§ããæ»ãããªãµãŒãã§ã¹ãè€éãªãã£ããŒã«ãå¹ççã«ã¬ã³ããªã³ã°ã§ããŸããè£œé æ¥ã«ãããŠãããã»ã¬ãŒã·ã§ã³ã«ãããèšèšè ã¯èšèšãè¿ éã«ç¹°ãè¿ããæçµè£œåãé«å¿ å®åºŠã§èŠèŠåã§ããŸããæ¬ é¥ããã§ãã¯ããèšèšãæé©åããããã«ãè€éãªå¹ŸäœåŠç圢ç¶ããªã¢ã«ã¿ã€ã ã§æäœããã³æ€æ»ã§ããŸãã
ããã©ãŒãã³ã¹æé©åæŠç¥
ããã»ã¬ãŒã·ã§ã³ã¯èŠèŠçãªå質ãå€§å¹ ã«åäžãããããšãã§ããŸãããããã«ããã¯ãé¿ããããã«ã¯ããã©ãŒãã³ã¹ãæé©åããããšãéèŠã§ãã以äžã«ããã€ãã®äž»èŠãªæŠç¥ã瀺ããŸãïŒ
ããã»ã¬ãŒã·ã§ã³ã¬ãã«ã®æå°å
æãŸããèŠèŠå質ãéæã§ããç¯å²ã§ãå¯èœãªéãäœãããã»ã¬ãŒã·ã§ã³ã¬ãã«ã䜿çšããŠãã ãããéå°ãªããã»ã¬ãŒã·ã§ã³ã¯ãå€§å¹ ãªããã©ãŒãã³ã¹äœäžã«ã€ãªããå¯èœæ§ããããŸãã
ã·ã§ãŒããŒã³ãŒãã®æé©å
ããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã·ã§ãŒããŒãšè©äŸ¡ã·ã§ãŒããŒãããã©ãŒãã³ã¹ã®ããã«æé©åãããŠããããšã確èªããŠãã ãããè€éãªèšç®ãäžèŠãªæäœã¯é¿ããŠãã ããã äŸãã°ããã䜿ãããæ°åŠé¢æ°ã®ããã«äºåã«èšç®ãããã«ãã¯ã¢ããããŒãã«ã䜿çšããããèŠèŠçãªå¿ å®åºŠãç ç²ã«ããããšãªãè€éãªèšç®ãç°¡ç¥åãããããŸãã
詳现ã¬ãã«ïŒLODïŒæè¡ã®äœ¿çš
ããã»ã¬ãŒã·ã§ã³ãããããããã³ã°ãã¡ãã·ã¥ç°¡ç¥åãªã©ã®ä»ã®LODæè¡ãšçµã¿åãããŠãããã©ãŒãã³ã¹ãããã«æé©åããŸãã åãã¢ã»ããã®ç°ãªã詳现ã¬ãã«ã®ããŒãžã§ã³ãè€æ°å®è£ ããã«ã¡ã©ããã®è·é¢ãä»ã®ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ã«åºã¥ããŠåãæ¿ããŸãã ããã«ãããé ãã®ãªããžã§ã¯ãã®ã¬ã³ããªã³ã°è² è·ãå€§å¹ ã«åæžã§ããŸãã
ãããåŠçãšã€ã³ã¹ã¿ã³ã·ã³ã°
å¯èœãªéããè€æ°ã®ããã»ã¬ãŒã·ã§ã³ããããªããžã§ã¯ããåäžã®æç»åŒã³åºãã«ãŸãšããŸããã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããŠãåããªããžã§ã¯ãã®è€æ°ã®ã³ããŒãç°ãªã倿ã§ã¬ã³ããªã³ã°ããŸããäŸãã°ãå€ãã®æšã ãããæ£®ãã¬ã³ããªã³ã°ããå Žåãæšã®ã¢ãã«ãã€ã³ã¹ã¿ã³ã¹åããåã€ã³ã¹ã¿ã³ã¹ã«ããããªããªãšãŒã·ã§ã³ãé©çšããããšã§æé©åã§ããŸãã
ãããã¡ã€ãªã³ã°ãšãããã°
WebGLãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããã»ã¬ãŒã·ã§ã³ãã€ãã©ã€ã³ã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ããŸããç°ãªãããã»ã¬ãŒã·ã§ã³ã¬ãã«ãã·ã§ãŒããŒã®æé©åã詊ããŠãèŠèŠå質ãšããã©ãŒãã³ã¹ã®æé©ãªãã©ã³ã¹ãèŠã€ããŸãã ããã©ãŒãã³ã¹åæããŒã«ã¯ãéå°ãªGPUãªãœãŒã¹ãæ¶è²»ããã·ã§ãŒããŒã¹ããŒãžãæäœãç¹å®ããã®ã«åœ¹ç«ã¡ãçãçµã£ãæé©åäœæ¥ãå¯èœã«ããŸãã
WebGLéçºã«ãããåœéçãªèæ ®äºé
ã°ããŒãã«ãªèŠèŽè åãã«WebGLã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåã以äžã®èŠçŽ ãèæ ®ããããšãäžå¯æ¬ ã§ãïŒ
ããã€ã¹äºææ§
ã¢ããªã±ãŒã·ã§ã³ãããŒãšã³ãã®ã¢ãã€ã«ããã€ã¹ãå«ãå¹ åºãããã€ã¹ã§ã¹ã ãŒãºã«åäœããããšã確èªããŠãã ããã é©å¿ããã»ã¬ãŒã·ã§ã³ã¯ã詳现床ãèªåçã«äžããããšã§ãæ§èœã®äœãããã€ã¹ã§ã®ããã©ãŒãã³ã¹ç¶æã«åœ¹ç«ã¡ãŸãã äžçäžã§äžè²«ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããã«ã¯ãããŸããŸãªãã©ãããã©ãŒã ããã©ãŠã¶ã§ã®åŸ¹åºçãªãã¹ããäžå¯æ¬ ã§ãã
ãããã¯ãŒã¯ç¶æ³
é ãã€ã³ã¿ãŒãããæ¥ç¶ãå«ãããŸããŸãªãããã¯ãŒã¯ç¶æ³ã«åãããŠã¢ããªã±ãŒã·ã§ã³ãæé©åããŸãã ããã°ã¬ãã·ãããŒãã£ã³ã°ããã£ãã·ã³ã°ãªã©ã®æè¡ã䜿çšããŠããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããŸãããããã¯ãŒã¯åž¯åå¹ ã«åºã¥ããŠãã¯ã¹ãã£è§£å床ãé©å¿çã«å€æŽããæ©èœãå®è£ ããæ¥ç¶ãå¶éãããŠããç¶æ³ã§ãã¹ã ãŒãºãªã¹ããªãŒãã³ã°ãšã¬ã³ããªã³ã°ã確ä¿ããããšãæ€èšããŠãã ããã
ããŒã«ã©ã€ãŒãŒã·ã§ã³
ã¢ããªã±ãŒã·ã§ã³ã®ããã¹ããšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãããŒã«ã©ã€ãºããŠãããŸããŸãªèšèªããµããŒãããŸãã åœéåïŒi18nïŒã©ã€ãã©ãªã䜿çšããŠãããã¹ãã®æžåŒèšå®ãæ¥ä»/æå»ã®æ £ç¿ãåŠçããŸãã ãŠãŒã¶ãŒãæ¯åœèªã§ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ããããšã§ã䜿ãããããšãšã³ã²ãŒãžã¡ã³ããåäžããŸãã
ã¢ã¯ã»ã·ããªãã£
é害ãæã€ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã ç»åã«ä»£æ¿ããã¹ããæäŸããããŒããŒãããã²ãŒã·ã§ã³ã䜿çšããã¢ããªã±ãŒã·ã§ã³ãã¹ã¯ãªãŒã³ãªãŒããŒãšäºææ§ãããããšã確èªããŸãã ã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ã«åŸãããšã§ãã¢ããªã±ãŒã·ã§ã³ãå æ¬çã§ãããåºãå±€ã®ãŠãŒã¶ãŒã«å©çšå¯èœã«ãªããŸãã
WebGLããã»ã¬ãŒã·ã§ã³ã®æªæ¥
WebGLããã»ã¬ãŒã·ã§ã³ã¯ãåžžã«é²åãç¶ãã匷åãªæè¡ã§ãã ããŒããŠã§ã¢ãšãœãããŠã§ã¢ãæ¹åããç¶ããã«ã€ããŠãå°æ¥çã«ã¯ããã«æŽç·Žãããããã»ã¬ãŒã·ã§ã³ã®å¿çšãèŠãããããšãæåŸ ãããŸããè峿·±ãçºå±ã®1ã€ã¯ãWebAssemblyïŒWASMïŒãšã®ããç·å¯ãªçµ±åã®å¯èœæ§ã§ããããã«ãããããè€éã§èšç®éçŽçãªããã»ã¬ãŒã·ã§ã³ã¢ã«ãŽãªãºã ããå€§å¹ ãªããã©ãŒãã³ã¹ã®ãªãŒããŒããããªãã«ãã©ãŠã¶ã§çŽæ¥å®è¡ã§ããããã«ãªãå¯èœæ§ããããŸãã ããã¯ãããã·ãŒãžã£ã«çæããªã¢ã«ã¿ã€ã ã·ãã¥ã¬ãŒã·ã§ã³ããã®ä»ã®é«åºŠãªã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã«æ°ããªå¯èœæ§ãéãã§ãããã
çµè«
WebGLã®ãžãªã¡ããªããã»ã¬ãŒã·ã§ã³å¶åŸ¡ã¯ããµãŒãã§ã¹ã®ãã£ããŒã«ã管çãã匷åãªææ®µãæäŸããèŠèŠçã«èŠäºã§é«æ§èœãª3Dã°ã©ãã£ãã¯ã¹ã®äœæãå¯èœã«ããŸããäžå¿çãªæŠå¿µãçè§£ããé©å¿ããã»ã¬ãŒã·ã§ã³æè¡ãå®è£ ããããã©ãŒãã³ã¹ãæé©åããããšã§ãéçºè ã¯ããã»ã¬ãŒã·ã§ã³ãæå€§éã«æŽ»çšã§ããŸããåœéçãªèŠçŽ ãæ éã«èæ ®ããããšã§ãWebGLã¢ããªã±ãŒã·ã§ã³ã¯äžçäžã®ãŠãŒã¶ãŒã«ã·ãŒã ã¬ã¹ã§é åçãªäœéšãæäŸã§ããŸããWebGLãé²åãç¶ããã«ã€ããŠãããã»ã¬ãŒã·ã§ã³ã¯ééããªããŠã§ãããŒã¹ã®3Dã°ã©ãã£ãã¯ã¹ã®æªæ¥ã圢äœãäžã§ãŸããŸãéèŠãªåœ¹å²ãæããã§ãããã