倿°ã®é¡äŒŒãªããžã§ã¯ããå¹ççã«ã¬ã³ããªã³ã°ããããã®WebGLã€ã³ã¹ã¿ã³ã¹å屿§ã®è©³çްãªè§£èª¬ãæŠå¿µãå®è£ ãæé©åãå®äžçã®äŸãç¶²çŸ ããŸãã
WebGLã€ã³ã¹ã¿ã³ã¹å屿§ïŒå¹ççãªã€ã³ã¹ã¿ã³ã¹ããŒã¿ç®¡ç
çŸä»£ã®3Dã°ã©ãã£ãã¯ã¹ã«ãããŠã倿°ã®é¡äŒŒãªããžã§ã¯ããã¬ã³ããªã³ã°ããããšã¯äžè¬çãªã¿ã¹ã¯ã§ããäŸãã°ãæ£®ã®æšã ã人ã ã®çŸ€è¡ãç²åã®çŸ€ããªã©ã衚瀺ããã·ããªãªãèããŠã¿ãŠãã ãããåãªããžã§ã¯ããåå¥ã«ã¬ã³ããªã³ã°ããã®ã¯èšç®ã³ã¹ããé«ããããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ã€ãªããå¯èœæ§ããããŸããWebGLã®ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã¯ãåäžã®æç»ã³ãŒã«ã§ç°ãªã屿§ãæã€åããªããžã§ã¯ãã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãæç»ã§ããããã«ããããšã§ã匷åãªè§£æ±ºçãæäŸããŸããããã«ãããè€æ°ã®æç»ã³ãŒã«ã«é¢é£ãããªãŒããŒããããå€§å¹ ã«åæžãããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãèããåäžããŸãããã®èšäºã§ã¯ãWebGLã€ã³ã¹ã¿ã³ã¹å屿§ãçè§£ãå®è£ ããããã®å æ¬çãªã¬ã€ããæäŸããŸãã
ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã®çè§£
ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã¯ãåäžã®æç»ã³ãŒã«ã§åããžãªã¡ããªã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãç°ãªã屿§ïŒäŸïŒäœçœ®ãå転ãè²ïŒã§æç»ããæè¡ã§ããåããžãªã¡ããªããŒã¿ãè€æ°åéä¿¡ãã代ããã«ãäžåºŠã ãéä¿¡ããã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã®é åãäžç·ã«æž¡ããŸããGPUã¯ãããã®ã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã䜿çšããŠãåã€ã³ã¹ã¿ã³ã¹ã®ã¬ã³ããªã³ã°ãå€åãããŸããããã«ãããCPUã®ãªãŒããŒããããšã¡ã¢ãªåž¯åå¹ ãåæžãããå€§å¹ ãªããã©ãŒãã³ã¹åäžãããããããŸãã
ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã®å©ç¹
- CPUãªãŒããŒãããã®åæžïŒ æç»ã³ãŒã«ã®æ°ãæå°éã«æããCPUåŽã®åŠçãåæžããŸãã
- ã¡ã¢ãªåž¯åå¹ ã®æ¹åïŒ ãžãªã¡ããªããŒã¿ãäžåºŠã ãéä¿¡ãããããã¡ã¢ãªè»¢éãåæžãããŸãã
- ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã®åäžïŒ ãªãŒããŒãããã®åæžã«ããããã¬ãŒã ã¬ãŒãïŒFPSïŒãå šäœçã«åäžããŸãã
ã€ã³ã¹ã¿ã³ã¹å屿§ã®ç޹ä»
ã€ã³ã¹ã¿ã³ã¹å屿§ã¯ãåã ã®é ç¹ã§ã¯ãªããåã ã®ã€ã³ã¹ã¿ã³ã¹ã«é©çšãããé ç¹å±æ§ã§ãããžãªã¡ããªã®åã€ã³ã¹ã¿ã³ã¹ãåºå¥ããããã«å¿ èŠãªãŠããŒã¯ãªããŒã¿ãæäŸãããããã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã«äžå¯æ¬ ã§ããWebGLã§ã¯ãã€ã³ã¹ã¿ã³ã¹å屿§ã¯é ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒã«ãã€ã³ããããç¹å®ã®WebGLæ¡åŒµæ©èœããŸãã¯ãã奜ãŸããã¯WebGL2ã®ã³ã¢æ©èœã䜿çšããŠèšå®ãããŸãã
äž»èŠãªæŠå¿µ
- ãžãªã¡ããªããŒã¿ïŒ ã¬ã³ããªã³ã°ãããåºæ¬ãžãªã¡ããªïŒäŸïŒç«æ¹äœãçãæšã®ã¢ãã«ïŒãããã¯éåžžã®é ç¹å±æ§ã«æ ŒçŽãããŸãã
- ã€ã³ã¹ã¿ã³ã¹ããŒã¿ïŒ åã€ã³ã¹ã¿ã³ã¹ã§ç°ãªãããŒã¿ïŒäŸïŒäœçœ®ãå転ãã¹ã±ãŒã«ãè²ïŒãããã¯ã€ã³ã¹ã¿ã³ã¹å屿§ã«æ ŒçŽãããŸãã
- é ç¹ã·ã§ãŒããŒïŒ ãžãªã¡ããªããŒã¿ãšã€ã³ã¹ã¿ã³ã¹ããŒã¿ã®äž¡æ¹ã«åºã¥ããŠé ç¹ã倿ãã圹å²ãæ ãã·ã§ãŒããŒããã°ã©ã ã
- gl.drawArraysInstanced() / gl.drawElementsInstanced(): ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ãéå§ããããã«äœ¿çšãããWebGL颿°ã
WebGL2ã§ã®ã€ã³ã¹ã¿ã³ã¹å屿§ã®å®è£
WebGL2ã¯ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ããã€ãã£ãã«ãµããŒãããŠãããå®è£ ãããã¯ãªãŒã³ã§å¹ççã«ãªããŸãã以äžã«ã¹ããããã€ã¹ãããã®ã¬ã€ãã瀺ããŸãïŒ
ã¹ããã1ïŒã€ã³ã¹ã¿ã³ã¹ããŒã¿ã®äœæãšãã€ã³ã
ãŸããã€ã³ã¹ã¿ã³ã¹ããŒã¿ãä¿æããããã®ãããã¡ãäœæããå¿ èŠããããŸãããã®ããŒã¿ã«ã¯éåžžãäœçœ®ãå転ïŒã¯ã©ãŒã¿ããªã³ãŸãã¯ãªã€ã©ãŒè§ã§è¡šçŸïŒãã¹ã±ãŒã«ãè²ãªã©ã®å±æ§ãå«ãŸããŸããåã€ã³ã¹ã¿ã³ã¹ãç°ãªãäœçœ®ãšè²ãæã€ç°¡åãªäŸãäœæããŠã¿ãŸãããïŒ
// Number of instances
const numInstances = 1000;
// Create arrays to store instance data
const instancePositions = new Float32Array(numInstances * 3); // x, y, z for each instance
const instanceColors = new Float32Array(numInstances * 4); // r, g, b, a for each instance
// Populate the instance data (example: random positions and colors)
for (let i = 0; i < numInstances; ++i) {
const x = (Math.random() - 0.5) * 20; // Range: -10 to 10
const y = (Math.random() - 0.5) * 20;
const z = (Math.random() - 0.5) * 20;
instancePositions[i * 3 + 0] = x;
instancePositions[i * 3 + 1] = y;
instancePositions[i * 3 + 2] = z;
const r = Math.random();
const g = Math.random();
const b = Math.random();
const a = 1.0;
instanceColors[i * 4 + 0] = r;
instanceColors[i * 4 + 1] = g;
instanceColors[i * 4 + 2] = b;
instanceColors[i * 4 + 3] = a;
}
// Create a buffer for instance positions
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, instancePositions, gl.STATIC_DRAW);
// Create a buffer for instance colors
const colorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, instanceColors, gl.STATIC_DRAW);
ã¹ããã2ïŒé ç¹å±æ§ã®èšå®
次ã«ãé ç¹ã·ã§ãŒããŒã®é ç¹å±æ§ãã€ã³ã¹ã¿ã³ã¹ããŒã¿ã䜿çšããããã«èšå®ããå¿ èŠããããŸããããã«ã¯ã屿§ã®äœçœ®ããããã¡ãããã³é€æ°ïŒdivisorïŒã®æå®ãå«ãŸããŸãã逿°ãéèŠã§ãïŒé€æ°ã0ã®å Žåã屿§ã¯é ç¹ããšã«é²ã¿ãŸããã1ã®å Žåã¯ã€ã³ã¹ã¿ã³ã¹ããšã«é²ã¿ãŸãããã倧ããªå€ã¯ã*n*ã€ã³ã¹ã¿ã³ã¹ããšã«é²ãããšãæå³ããŸãã
// Get attribute locations from the shader program
const positionAttributeLocation = gl.getAttribLocation(shaderProgram, "instancePosition");
const colorAttributeLocation = gl.getAttribLocation(shaderProgram, "instanceColor");
// Configure the position attribute
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.vertexAttribPointer(
positionAttributeLocation,
3, // Size: 3 components (x, y, z)
gl.FLOAT, // Type: Float
false, // Normalized: No
0, // Stride: 0 (tightly packed)
0 // Offset: 0
);
gl.enableVertexAttribArray(positionAttributeLocation);
// Set the divisor to 1, indicating that this attribute changes per instance
gl.vertexAttribDivisor(positionAttributeLocation, 1);
// Configure the color attribute
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.vertexAttribPointer(
colorAttributeLocation,
4, // Size: 4 components (r, g, b, a)
gl.FLOAT, // Type: Float
false, // Normalized: No
0, // Stride: 0 (tightly packed)
0 // Offset: 0
);
gl.enableVertexAttribArray(colorAttributeLocation);
// Set the divisor to 1, indicating that this attribute changes per instance
gl.vertexAttribDivisor(colorAttributeLocation, 1);
ã¹ããã3ïŒé ç¹ã·ã§ãŒããŒã®èšè¿°
é ç¹ã·ã§ãŒããŒã¯ãéåžžã®é ç¹å±æ§ïŒãžãªã¡ããªçšïŒãšã€ã³ã¹ã¿ã³ã¹å屿§ïŒã€ã³ã¹ã¿ã³ã¹åºæã®ããŒã¿çšïŒã®äž¡æ¹ã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã以äžã«äŸã瀺ããŸãïŒ
#version 300 es
in vec3 a_position; // Vertex position (geometry data)
in vec3 instancePosition; // Instance position (instanced attribute)
in vec4 instanceColor; // Instance color (instanced attribute)
out vec4 v_color;
uniform mat4 u_modelViewProjectionMatrix;
void main() {
vec4 worldPosition = vec4(a_position, 1.0) + vec4(instancePosition, 0.0);
gl_Position = u_modelViewProjectionMatrix * worldPosition;
v_color = instanceColor;
}
ã¹ããã4ïŒã€ã³ã¹ã¿ã³ã¹ã®æç»
æåŸã«ãgl.drawArraysInstanced()ãŸãã¯gl.drawElementsInstanced()ã䜿çšããŠã€ã³ã¹ã¿ã³ã¹ãæç»ã§ããŸãã
// Bind the vertex array object (VAO) containing the geometry data
gl.bindVertexArray(vao);
// Set the model-view-projection matrix (assuming it's already calculated)
gl.uniformMatrix4fv(u_modelViewProjectionMatrixLocation, false, modelViewProjectionMatrix);
// Draw the instances
gl.drawArraysInstanced(
gl.TRIANGLES, // Mode: Triangles
0, // First: 0 (start at the beginning of the vertex array)
numVertices, // Count: Number of vertices in the geometry
numInstances // InstanceCount: Number of instances to draw
);
WebGL1ã§ã®ã€ã³ã¹ã¿ã³ã¹å屿§ã®å®è£ ïŒæ¡åŒµæ©èœã䜿çšïŒ
WebGL1ã¯ãã€ãã£ãã§ã¯ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ããµããŒãããŠããŸãããããããANGLE_instanced_arraysæ¡åŒµæ©èœã䜿çšããããšã§åãçµæãåŸãããšãã§ããŸãããã®æ¡åŒµæ©èœã¯ãã€ã³ã¹ã¿ã³ã¹ã®èšå®ãšæç»ã®ããã®æ°ãã颿°ãå°å
¥ããŸãã
ã¹ããã1ïŒæ¡åŒµæ©èœã®ååŸ
ãŸããgl.getExtension()ã䜿çšããŠæ¡åŒµæ©èœãååŸããå¿
èŠããããŸãã
const ext = gl.getExtension('ANGLE_instanced_arrays');
if (!ext) {
console.error('ANGLE_instanced_arrays extension is not supported.');
return;
}
ã¹ããã2ïŒã€ã³ã¹ã¿ã³ã¹ããŒã¿ã®äœæãšãã€ã³ã
ãã®ã¹ãããã¯WebGL2ãšåãã§ãããããã¡ãäœæããã€ã³ã¹ã¿ã³ã¹ããŒã¿ãå ¥åããŸãã
ã¹ããã3ïŒé ç¹å±æ§ã®èšå®
äž»ãªéãã¯ã逿°ãèšå®ããããã«äœ¿çšãã颿°ã§ããgl.vertexAttribDivisor()ã®ä»£ããã«ãext.vertexAttribDivisorANGLE()ã䜿çšããŸãã
// Get attribute locations from the shader program
const positionAttributeLocation = gl.getAttribLocation(shaderProgram, "instancePosition");
const colorAttributeLocation = gl.getAttribLocation(shaderProgram, "instanceColor");
// Configure the position attribute
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.vertexAttribPointer(
positionAttributeLocation,
3, // Size: 3 components (x, y, z)
gl.FLOAT, // Type: Float
false, // Normalized: No
0, // Stride: 0 (tightly packed)
0 // Offset: 0
);
gl.enableVertexAttribArray(positionAttributeLocation);
// Set the divisor to 1, indicating that this attribute changes per instance
ext.vertexAttribDivisorANGLE(positionAttributeLocation, 1);
// Configure the color attribute
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.vertexAttribPointer(
colorAttributeLocation,
4, // Size: 4 components (r, g, b, a)
gl.FLOAT, // Type: Float
false, // Normalized: No
0, // Stride: 0 (tightly packed)
0 // Offset: 0
);
gl.enableVertexAttribArray(colorAttributeLocation);
// Set the divisor to 1, indicating that this attribute changes per instance
ext.vertexAttribDivisorANGLE(colorAttributeLocation, 1);
ã¹ããã4ïŒã€ã³ã¹ã¿ã³ã¹ã®æç»
åæ§ã«ãã€ã³ã¹ã¿ã³ã¹ãæç»ããããã«äœ¿çšãã颿°ãç°ãªããŸããgl.drawArraysInstanced()ãšgl.drawElementsInstanced()ã®ä»£ããã«ãext.drawArraysInstancedANGLE()ãšext.drawElementsInstancedANGLE()ã䜿çšããŸãã
// Bind the vertex array object (VAO) containing the geometry data
gl.bindVertexArray(vao);
// Set the model-view-projection matrix (assuming it's already calculated)
gl.uniformMatrix4fv(u_modelViewProjectionMatrixLocation, false, modelViewProjectionMatrix);
// Draw the instances
ext.drawArraysInstancedANGLE(
gl.TRIANGLES, // Mode: Triangles
0, // First: 0 (start at the beginning of the vertex array)
numVertices, // Count: Number of vertices in the geometry
numInstances // InstanceCount: Number of instances to draw
);
ã·ã§ãŒããŒã«é¢ããèæ ®äºé
é ç¹ã·ã§ãŒããŒã¯ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã«ãããŠéèŠãªåœ¹å²ãæãããŸãããžãªã¡ããªããŒã¿ãšã€ã³ã¹ã¿ã³ã¹ããŒã¿ãçµã¿åãããŠãæçµçãªé ç¹äœçœ®ããã®ä»ã®å±æ§ãèšç®ãã責任ããããŸãã以äžã«ããã€ãã®äž»èŠãªèæ ®äºé ã瀺ããŸãïŒ
屿§ãžã®ã¢ã¯ã»ã¹
é ç¹ã·ã§ãŒããŒãéåžžã®é ç¹å±æ§ãšã€ã³ã¹ã¿ã³ã¹å屿§ã®äž¡æ¹ãæ£ãã宣èšããã¢ã¯ã»ã¹ããŠããããšã確èªããŠãã ãããgl.getAttribLocation()ããååŸããæ£ãã屿§ãã±ãŒã·ã§ã³ã䜿çšããŸãã
倿
ã€ã³ã¹ã¿ã³ã¹ããŒã¿ã«åºã¥ããŠããžãªã¡ããªã«å¿ èŠãªå€æãé©çšããŸããããã«ã¯ãã€ã³ã¹ã¿ã³ã¹ã®äœçœ®ãå転ãã¹ã±ãŒã«ã«åºã¥ããŠãžãªã¡ããªãå¹³è¡ç§»åãåè»¢ãæ¡å€§çž®å°ããããšãå«ãŸããå ŽåããããŸãã
ããŒã¿è£é
é¢é£ããããŒã¿ïŒäŸïŒè²ããã¯ã¹ãã£åº§æšïŒããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããããªãåŠçãè¡ããŸãããã®ããŒã¿ã¯é ç¹äœçœ®ã«åºã¥ããŠè£éãããå ŽåããããŸãã
æé©åæè¡
ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã¯å€§å¹ ãªããã©ãŒãã³ã¹åäžããããããŸãããã¬ã³ããªã³ã°å¹çãããã«é«ããããã«æ¡çšã§ããããã€ãã®æé©åæè¡ããããŸãã
ããŒã¿ãããã³ã°
é¢é£ããã€ã³ã¹ã¿ã³ã¹ããŒã¿ãåäžã®ãããã¡ã«ãŸãšããããšã§ããããã¡ã®ãã€ã³ãã屿§ãã€ã³ã¿ã®åŒã³åºãåæ°ãæžãããŸããäŸãã°ãäœçœ®ãå転ãã¹ã±ãŒã«ãåäžã®ãããã¡ã«ãŸãšããããšãã§ããŸãã
ããŒã¿ã¢ã©ã€ã¡ã³ã
ã¡ã¢ãªã¢ã¯ã»ã¹ã®ããã©ãŒãã³ã¹ãåäžãããããã«ãã€ã³ã¹ã¿ã³ã¹ããŒã¿ãã¡ã¢ãªå ã§é©åã«ã¢ã©ã€ã¡ã³ããããŠããããšã確èªããŠãã ãããããã«ã¯ãå屿§ããã®ãµã€ãºã®åæ°ã§ããã¡ã¢ãªã¢ãã¬ã¹ããå§ãŸãããã«ããŒã¿ãããã£ã³ã°ããããšãå«ãŸããå ŽåããããŸãã
ãã©ã¹ã¿ã ã«ãªã³ã°
ã«ã¡ã©ã®èŠéå°ã®å€ã«ããã€ã³ã¹ã¿ã³ã¹ã®ã¬ã³ããªã³ã°ãé¿ããããã«ããã©ã¹ã¿ã ã«ãªã³ã°ãå®è£ ããŸããããã«ãããç¹ã«ã€ã³ã¹ã¿ã³ã¹æ°ãå€ãã·ãŒã³ã§åŠçãå¿ èŠãªã€ã³ã¹ã¿ã³ã¹ã®æ°ãå€§å¹ ã«åæžã§ããŸãã
詳现ã¬ãã«ïŒLODïŒ
ã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠãã€ã³ã¹ã¿ã³ã¹ã«ç°ãªã詳现ã¬ãã«ã䜿çšããŸããé ãã«ããã€ã³ã¹ã¿ã³ã¹ã¯äœã詳现ã¬ãã«ã§ã¬ã³ããªã³ã°ã§ããåŠçãå¿ èŠãªé ç¹ã®æ°ãæžããããšãã§ããŸãã
ã€ã³ã¹ã¿ã³ã¹ã®ãœãŒã
ãªãŒããŒãããŒãæžããããã«ãã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠã€ã³ã¹ã¿ã³ã¹ããœãŒãããŸããã€ã³ã¹ã¿ã³ã¹ãåããåŸãã«ã¬ã³ããªã³ã°ããããšã§ãç¹ã«éãªãåãã€ã³ã¹ã¿ã³ã¹ãå€ãã·ãŒã³ã§ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãåäžããŸãã
å®äžçã®äŸ
ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã¯ãå¹ åºãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããŸãã以äžã«ããã€ãã®äŸã瀺ããŸãïŒ
森ã®ã¬ã³ããªã³ã°
æ£®ã®æšã ãã¬ã³ããªã³ã°ããããšã¯ãã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã䜿çšã§ããå žåçãªäŸã§ããåæšã¯åããžãªã¡ããªã®ã€ã³ã¹ã¿ã³ã¹ã§ãããäœçœ®ãå転ãã¹ã±ãŒã«ãç°ãªããŸããã¢ããŸã³ã®ç±åž¯éšæãã«ãªãã©ã«ãã¢ã®ã»ã³ã€ã¢ã®æ£®ãèããŠã¿ãŠãã ãããã©ã¡ãã®ç°å¢ãããã®ãããªæè¡ãªãã§ã¯ã¬ã³ããªã³ã°ãã»ãŒäžå¯èœã§ãã
矀è¡ã·ãã¥ã¬ãŒã·ã§ã³
人ã ãåç©ã®çŸ€è¡ãã·ãã¥ã¬ãŒãããããšã¯ãã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã䜿çšããŠå¹ççã«å®çŸã§ããŸããå人ãåç©ã¯åããžãªã¡ããªã®ã€ã³ã¹ã¿ã³ã¹ã§ãããã¢ãã¡ãŒã·ã§ã³ãæè£ ãã¢ã¯ã»ãµãªãŒãç°ãªããŸãããã©ã±ã·ã¥ã®ã«ããããªåžå Žããæ±äº¬ã®äººå£å¯åºŠã®é«ãéããã·ãã¥ã¬ãŒãããããšãæ³åããŠã¿ãŠãã ããã
ããŒãã£ã¯ã«ã·ã¹ãã
ç«ãç ãççºãªã©ã®ããŒãã£ã¯ã«ã·ã¹ãã ã¯ãã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã䜿çšããŠã¬ã³ããªã³ã°ã§ããŸããåããŒãã£ã¯ã«ã¯åããžãªã¡ããªïŒäŸïŒåè§åœ¢ãçïŒã®ã€ã³ã¹ã¿ã³ã¹ã§ãããäœçœ®ããµã€ãºãè²ãç°ãªããŸããã·ãããŒããŒããŒã®è±ç«å€§äŒããªãŒãã©ãæ³åããŠã¿ãŠãã ãããã©ã¡ããäœåãã®ããŒãã£ã¯ã«ãå¹ççã«ã¬ã³ããªã³ã°ããå¿ èŠããããŸãã
建ç¯ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³
çªãæ€ åãç §æãªã©ã倿°ã®åäžãŸãã¯é¡äŒŒã®èŠçŽ ã§å€§èŠæš¡ãªå»ºç¯ã·ãŒã³ãæ§æããå Žåãã€ã³ã¹ã¿ã³ã¹åã¯å€§ããªå©ç¹ããããããŸããããã«ããã詳现ã§ãªã¢ã«ãªç°å¢ãå¹ççã«ã¬ã³ããªã³ã°ã§ããŸããã«ãŒãã«çŸè¡é€šãã¿ãŒãžã»ããã«ã®ããŒãã£ã«ãã¢ãŒãèããŠã¿ãŠãã ããããããã¯å€ãã®ç¹°ãè¿ãèŠçŽ ãæã€è€éãªã·ãŒã³ã§ãã
çµè«
WebGLã€ã³ã¹ã¿ã³ã¹å屿§ã¯ã倿°ã®é¡äŒŒãªããžã§ã¯ããã¬ã³ããªã³ã°ããããã®åŒ·åã§å¹ççãªæ¹æ³ãæäŸããŸããã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã掻çšããããšã§ãCPUã®ãªãŒããŒãããã倧å¹
ã«åæžããã¡ã¢ãªåž¯åå¹
ãæ¹åããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããã²ãŒã ãã·ãã¥ã¬ãŒã·ã§ã³ããŸãã¯ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ã¢ããªã±ãŒã·ã§ã³ãéçºããŠããå Žåã§ããã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ãçè§£ãå®è£
ããããšã¯ã²ãŒã ãã§ã³ãžã£ãŒãšãªãåŸãŸããWebGL2ã§ã®ãã€ãã£ããµããŒããšWebGL1ã§ã®ANGLE_instanced_arraysæ¡åŒµæ©èœã®å©çšå¯èœæ§ã«ãããã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã¯å¹
åºãéçºè
ãå©çšã§ããŸãããã®èšäºã§æŠèª¬ããæé ã«åŸããè°è«ãããæé©åæè¡ãé©çšããããšã§ããã©ãŠã¶ã§å¯èœãªããšã®éçãæŒãåºãããèŠèŠçã«èŠäºã§é«æ§èœãª3Dã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã