WebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã«ãããªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ãæ¢æ±ãäžçã®éçºè åãã«ãåºç€ãå®è£ ãããã©ãŒãã³ã¹ã®èæ ®äºé ã解説ããŸãã
WebGLã¬ã€ãã¬ãŒã·ã³ã°ïŒWebGLã³ã³ãã¥ãŒãã·ã§ãŒããŒã«ãããªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°
åçã®ããã«ãªã¢ã«ãªç»åã§æåãªã¬ã³ããªã³ã°æè¡ã§ããã¬ã€ãã¬ãŒã·ã³ã°ã¯ãåŸæ¥ãèšç®è² è·ãé«ãããªãã©ã€ã³ã®ã¬ã³ããªã³ã°ããã»ã¹ã«éå®ãããŠããŸãããããããGPUæè¡ã®é²æ©ãšã³ã³ãã¥ãŒãã·ã§ãŒããŒã®å°å ¥ã«ãããWebGLå ã§ã®ãªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ãžã®éãéããããŠã§ãããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ã«é«å¿ å®åºŠã®ã°ã©ãã£ãã¯ã¹ãããããããŸããããã®èšäºã§ã¯ããŠã§ãã°ã©ãã£ãã¯ã¹ã®éçãæŒãåºããããšã«é¢å¿ãæã€äžçäžã®éçºè ã察象ã«ãWebGLã®ã³ã³ãã¥ãŒãã·ã§ãŒããŒã䜿çšãããªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ã®å®è£ ã«é¢ããå æ¬çãªã¬ã€ããæäŸããŸãã
ã¬ã€ãã¬ãŒã·ã³ã°ãšã¯ïŒ
ã¬ã€ãã¬ãŒã·ã³ã°ã¯ãçŸå®äžçã§ã®å ã®é²ã¿æ¹ãã·ãã¥ã¬ãŒãããŸããããªãŽã³ãã©ã¹ã¿ã©ã€ãºãã代ããã«ãã¬ã€ãã¬ãŒã·ã³ã°ã¯ã«ã¡ã©ïŒãŸãã¯ç®ïŒããç»é¢äžã®åãã¯ã»ã«ãéããŠã·ãŒã³å ã«ã¬ã€ïŒå ç·ïŒãæå°ããŸãããããã®ã¬ã€ã¯ãªããžã§ã¯ããšäº€å·®ãããã®ãªããžã§ã¯ãã®ãããªã¢ã«ããããã£ã«åºã¥ããŠãå ã衚é¢ã§ã©ã®ããã«åå°ãçžäºäœçšããããèšç®ããããšã§ãã¯ã»ã«ã®è²ã決å®ãããŸãããã®ããã»ã¹ã«ã¯ãåå°ã屿ã圱ãå«ãŸããéåžžã«ãªã¢ã«ãªç»åãåŸãããŸãã
ã¬ã€ãã¬ãŒã·ã³ã°ã®äž»èŠæŠå¿µïŒ
- ã¬ã€ãã£ã¹ãã£ã³ã°ïŒ ã«ã¡ã©ããã·ãŒã³å ã«ã¬ã€ãå°åºããããã»ã¹ã
- 亀差å€å®ïŒ ã¬ã€ãã·ãŒã³å ã®ãªããžã§ã¯ããšã©ãã§äº€å·®ããããæ±ºå®ããããšã
- ãµãŒãã§ã¹ããŒãã«ïŒæ³ç·ïŒïŒ 亀差ç¹ã®è¡šé¢ã«åçŽãªãã¯ãã«ã§ãåå°ãšå±æã®èšç®ã«äœ¿çšãããŸãã
- ãããªã¢ã«ããããã£ïŒ 衚é¢ãå ãšã©ã®ããã«çžäºäœçšããããå®çŸ©ããŸãïŒäŸïŒè²ãåå°çãç²ãïŒã
- ã·ã£ããŠã¬ã€ïŒ 亀差ç¹ããå æºã«åãã£ãŠã¬ã€ãæå°ãããã®ç¹ã圱ã«ãªã£ãŠãããã©ããã倿ããŸãã
- åå°ã¬ã€ãšå±æã¬ã€ïŒ 亀差ç¹ããã¬ã€ãæå°ããåå°ãšå±æãã·ãã¥ã¬ãŒãããŸãã
ãªãWebGLãšã³ã³ãã¥ãŒãã·ã§ãŒããŒãªã®ãïŒ
WebGLã¯ããã©ã°ã€ã³ã䜿çšããã«ãŠã§ããã©ãŠã¶ã§2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®ã¯ãã¹ãã©ãããã©ãŒã APIãæäŸããŸããWebGL 2.0ã§å°å ¥ãããã³ã³ãã¥ãŒãã·ã§ãŒããŒã¯ãGPUäžã§ã®æ±çšèšç®ãå¯èœã«ããŸããããã«ãããGPUã®äžŠååŠçèœåãæŽ»çšããŠãã¬ã€ãã¬ãŒã·ã³ã°èšç®ãå¹ççã«å®è¡ã§ããŸãã
ã¬ã€ãã¬ãŒã·ã³ã°ã«WebGLã䜿çšããå©ç¹ïŒ
- ã¯ãã¹ãã©ãããã©ãŒã äºææ§ïŒ WebGLã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«é¢ä¿ãªããææ°ã®ãŠã§ããã©ãŠã¶ã§åäœããŸãã
- ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ïŒ é«éãªã¬ã³ããªã³ã°ã®ããã«GPUãæŽ»çšããŸãã
- ãã©ã°ã€ã³äžèŠïŒ ãŠãŒã¶ãŒã远å ã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸããã
- ã¢ã¯ã»ã·ããªãã£ïŒ ãŠã§ããéããŠãããå€ãã®äººã ãã¬ã€ãã¬ãŒã·ã³ã°ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã
ã³ã³ãã¥ãŒãã·ã§ãŒããŒã䜿çšããå©ç¹ïŒ
- 䞊ååŠçïŒ GPUã®å€§èŠæš¡äžŠåã¢ãŒããã¯ãã£ã掻çšããŠãå¹ççãªã¬ã€ãã¬ãŒã·ã³ã°èšç®ãè¡ããŸãã
- æè»æ§ïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã«åãããã«ã¹ã¿ã ã¢ã«ãŽãªãºã ãšæé©åãå¯èœã§ãã
- çŽæ¥çãªGPUã¢ã¯ã»ã¹ïŒ åŸæ¥ã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ããã€ãã¹ããããé«åºŠãªå¶åŸ¡ãå¯èœã«ããŸãã
å®è£ ã®æŠèŠ
WebGLã§ã³ã³ãã¥ãŒãã·ã§ãŒããŒã䜿çšããŠã¬ã€ãã¬ãŒã·ã³ã°ãå®è£ ããã«ã¯ãããã€ãã®éèŠãªã¹ããããå«ãŸããŸãïŒ
- WebGLã³ã³ããã¹ãã®èšå®ïŒ WebGLã³ã³ããã¹ããäœæããå¿ èŠãªæ¡åŒµæ©èœãæå¹ã«ããŸãïŒWebGL 2.0ãå¿ èŠã§ãïŒã
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®äœæïŒ ã¬ã€ãã¬ãŒã·ã³ã°èšç®ãå®è¡ããã³ã³ãã¥ãŒãã·ã§ãŒããŒã®GLSLã³ãŒããèšè¿°ããŸãã
- ã·ã§ãŒããŒã¹ãã¬ãŒãžãããã¡ãªããžã§ã¯ãïŒSSBOïŒã®äœæïŒ ã·ãŒã³ããŒã¿ãã¬ã€ããŒã¿ãæçµç»åãä¿åããããã«GPUäžã«ã¡ã¢ãªãå²ãåœãŠãŸãã
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ãã£ã¹ãããïŒ ã³ã³ãã¥ãŒãã·ã§ãŒããŒãèµ·åããŠããŒã¿ãåŠçããŸãã
- çµæã®èªã¿æ»ãïŒ ã¬ã³ããªã³ã°ãããç»åãSSBOããååŸããç»é¢ã«è¡šç€ºããŸãã
詳现ãªå®è£ æé
1. WebGLã³ã³ããã¹ãã®èšå®
æåã®ã¹ãããã¯ãWebGL 2.0ã³ã³ããã¹ããäœæããããšã§ããããã«ã¯ãHTMLããcanvasèŠçŽ ãååŸããWebGL2RenderingContextãèŠæ±ããããšãå«ãŸããŸããã³ã³ããã¹ããæ£åžžã«äœæãããããšã確èªããããã«ããšã©ãŒãã³ããªã³ã°ãéèŠã§ãã
const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl2');
if (!gl) {
console.error('WebGL 2.0 is not supported.');
}
2. ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®äœæ
ã¬ã€ãã¬ãŒãµãŒã®äžæ žã¯ãGLSLã§èšè¿°ãããã³ã³ãã¥ãŒãã·ã§ãŒããŒã§ãããã®ã·ã§ãŒããŒã¯ãã¬ã€ã®æå°ã亀差å€å®ãåãã¯ã»ã«ã®è²ã®èšç®ãæ åœããŸããã³ã³ãã¥ãŒãã·ã§ãŒããŒã¯ãã¯ãŒã¯ã°ã«ãŒãã®ã°ãªããäžã§åäœãããããããç»åã®å°ããªé åãåŠçããŸãã
以äžã¯ããã¯ã»ã«åº§æšã«åºã¥ããŠåºæ¬çãªè²ãèšç®ããã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ç°¡ç¥åãããäŸã§ãïŒ
#version 310 es
layout (local_size_x = 8, local_size_y = 8) in;
layout (std430, binding = 0) buffer OutputBuffer {
vec4 pixels[];
};
uniform ivec2 resolution;
void main() {
ivec2 pixelCoord = ivec2(gl_GlobalInvocationID.xy);
if (pixelCoord.x >= resolution.x || pixelCoord.y >= resolution.y) {
return;
}
float red = float(pixelCoord.x) / float(resolution.x);
float green = float(pixelCoord.y) / float(resolution.y);
float blue = 0.5;
pixels[pixelCoord.y * resolution.x + pixelCoord.x] = vec4(red, green, blue, 1.0);
}
ãã®ã·ã§ãŒããŒã¯ã8x8ã®ã¯ãŒã¯ã°ã«ãŒããµã€ãºã`pixels`ãšããååã®åºåãããã¡ãç»é¢è§£å床ã®ããã®uniform倿°ãå®çŸ©ããŸããåã¯ãŒã¯ã¢ã€ãã ïŒãã¯ã»ã«ïŒã¯ããã®äœçœ®ã«åºã¥ããŠè²ãèšç®ããåºåãããã¡ã«æžã蟌ã¿ãŸãã
3. ã·ã§ãŒããŒã¹ãã¬ãŒãžãããã¡ãªããžã§ã¯ãïŒSSBOïŒã®äœæ
SSBOã¯ãCPUãšGPUã®éã§å ±æãããããŒã¿ãæ ŒçŽããããã«äœ¿çšãããŸãããã®å ŽåãSSBOã䜿çšããŠã·ãŒã³ããŒã¿ïŒäŸïŒäžè§åœ¢ã®é ç¹ããããªã¢ã«ããããã£ïŒãã¬ã€ããŒã¿ãããã³æçµçã«ã¬ã³ããªã³ã°ãããç»åãæ ŒçŽããŸããSSBOãäœæãããã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãããåæããŒã¿ãå ¥åããŸãã
// Create the SSBO
const outputBuffer = gl.createBuffer();
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, outputBuffer);
gl.bufferData(gl.SHADER_STORAGE_BUFFER, imageWidth * imageHeight * 4 * 4, gl.DYNAMIC_COPY);
// Bind the SSBO to binding point 0
gl.bindBufferBase(gl.SHADER_STORAGE_BUFFER, 0, outputBuffer);
4. ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ãã£ã¹ããã
ã³ã³ãã¥ãŒãã·ã§ãŒããŒãå®è¡ããã«ã¯ãããããã£ã¹ãããããå¿ èŠããããŸããããã«ã¯ã忬¡å ã§èµ·åããã¯ãŒã¯ã°ã«ãŒãã®æ°ãæå®ããããšãå«ãŸããŸããã¯ãŒã¯ã°ã«ãŒãã®æ°ã¯ãç·ãã¯ã»ã«æ°ãã·ã§ãŒããŒã§å®çŸ©ãããã¯ãŒã¯ã°ã«ãŒããµã€ãºã§å²ãããšã«ãã£ãŠæ±ºå®ãããŸãã
const workGroupSizeX = 8;
const workGroupSizeY = 8;
const numWorkGroupsX = Math.ceil(imageWidth / workGroupSizeX);
const numWorkGroupsY = Math.ceil(imageHeight / workGroupSizeY);
gl.dispatchCompute(numWorkGroupsX, numWorkGroupsY, 1);
gl.memoryBarrier(gl.SHADER_STORAGE_BARRIER_BIT);
`gl.dispatchCompute`ã¯ã³ã³ãã¥ãŒãã·ã§ãŒããŒãèµ·åããŸãã`gl.memoryBarrier`ã¯ãCPUãSSBOããèªã¿åãããšããåã«ãGPUãSSBOãžã®æžã蟌ã¿ãå®äºããããšãä¿èšŒããŸãã
5. çµæã®èªã¿æ»ã
ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®å®è¡ãå®äºããåŸãã¬ã³ããªã³ã°ãããç»åãSSBOããCPUã«èªã¿æ»ãå¿ èŠããããŸããããã«ã¯ãCPUäžã«ãããã¡ãäœæãã`gl.getBufferSubData`ã䜿çšããŠSSBOããCPUãããã¡ã«ããŒã¿ãã³ããŒããããšãå«ãŸããŸããæåŸã«ããã®ããŒã¿ã䜿çšããŠç»åèŠçŽ ãäœæããŸãã
// Create a buffer on the CPU to hold the image data
const imageData = new Float32Array(imageWidth * imageHeight * 4);
// Bind the SSBO for reading
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, outputBuffer);
gl.getBufferSubData(gl.SHADER_STORAGE_BUFFER, 0, imageData);
// Create an image element from the data (example using a library like 'OffscreenCanvas')
// Display the image on the screen
ã·ãŒã³è¡šçŸãšé«éåæ§é
ã¬ã€ãã¬ãŒã·ã³ã°ã®éèŠãªåŽé¢ã¯ãã·ãŒã³å ã®ã¬ã€ãšãªããžã§ã¯ãéã®äº€å·®ç¹ãå¹ççã«èŠã€ããããšã§ããåã¬ã€ããã¹ãŠã®ãªããžã§ã¯ãã«å¯ŸããŠãã¹ããããã«ãŒããã©ãŒã¹ã®äº€å·®å€å®ã¯ãèšç®ã³ã¹ããéåžžã«é«ããªããŸããããã©ãŒãã³ã¹ãåäžãããããã«ãé«éåæ§é ã䜿çšããŠã·ãŒã³ããŒã¿ãæŽçããç¹å®ã®ã¬ã€ãšäº€å·®ããå¯èœæ§ã®äœããªããžã§ã¯ããè¿ éã«é€å€ããŸãã
äžè¬çãªé«éåæ§é ïŒ
- ããŠã³ãã£ã³ã°ããªã¥ãŒã éå±€ïŒBVHïŒïŒ åããŒãããªããžã§ã¯ãã®ã»ãããå²ãããŠã³ãã£ã³ã°ããªã¥ãŒã ã衚ãéå±€çãªããªãŒæ§é ã§ããããã«ãããã·ãŒã³ã®å€§éšåãè¿ éã«é€å€ã§ããŸãã
- Kd-TreeïŒ ã·ãŒã³ãååž°çã«å°ããªé åã«åå²ãã空éåå²ããŒã¿æ§é ã§ãã
- 空éããã·ã¥ïŒ ã·ãŒã³ãã»ã«ã®ã°ãªããã«åå²ãããªããžã§ã¯ãã亀差ããã»ã«ã«ãªããžã§ã¯ããæ ŒçŽããŸãã
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã§ã¯ãå®è£ ãæ¯èŒç容æã§ããã©ãŒãã³ã¹ãè¯å¥œãªãããBVHããã°ãã°å¥œãŸããéžæè¢ãšãªããŸããBVHã®å®è£ ã«ã¯ã以äžã®ã¹ããããå«ãŸããŸãïŒ
- ããŠã³ãã£ã³ã°ããã¯ã¹ã®èšç®ïŒ ã·ãŒã³å ã®åãªããžã§ã¯ãïŒäŸïŒäžè§åœ¢ïŒã®ããŠã³ãã£ã³ã°ããã¯ã¹ãèšç®ããŸãã
- ããªãŒã®æ§ç¯ïŒ åãªãŒãããŒããå°æ°ã®ãªããžã§ã¯ããå«ããŸã§ãã·ãŒã³ãååž°çã«å°ããªããŠã³ãã£ã³ã°ããã¯ã¹ã«åå²ããŸããäžè¬çãªåå²åºæºã«ã¯ãæé·è»žã®äžç¹ã衚é¢ç©ãã¥ãŒãªã¹ãã£ãã¯ïŒSAHïŒãªã©ããããŸãã
- ãã©ããŒãµã«ïŒ ã¬ã€ãã¬ãŒã·ã³ã°äžã«ãã«ãŒãããŒãããéå§ããŠBVHããã©ããŒã¹ããŸããã¬ã€ãããŒãã®ããŠã³ãã£ã³ã°ããã¯ã¹ãšäº€å·®ããå Žåããã®åããŒããååž°çã«ãã©ããŒã¹ããŸããã¬ã€ããªãŒãããŒããšäº€å·®ããå Žåããã®ããŒãã«å«ãŸãããªããžã§ã¯ãã«å¯ŸããŠäº€å·®å€å®ãå®è¡ããŸãã
GLSLã§ã®BVHæ§é ã®äŸïŒç°¡ç¥åïŒïŒ
struct BVHNode {
vec3 min;
vec3 max;
int leftChild;
int rightChild;
int triangleOffset; // Index of the first triangle in this node
int triangleCount; // Number of triangles in this node
};
ã¬ã€ãšäžè§åœ¢ã®äº€å·®å€å®
ã¬ã€ãã¬ãŒã·ã³ã°ã§æãåºæ¬çãªäº€å·®å€å®ã¯ãã¬ã€ãšäžè§åœ¢ã®äº€å·®å€å®ã§ãããã®ãã¹ããå®è¡ããããã®ã¢ã«ãŽãªãºã ã¯æ°å€ãååšããŸããããã®äžã§ãMöllerâTrumboreã¢ã«ãŽãªãºã ã¯ããã®å¹çæ§ãšåçŽãããåºã䜿çšãããŠããŸãã
MöllerâTrumboreã¢ã«ãŽãªãºã ïŒ
MöllerâTrumboreã¢ã«ãŽãªãºã ã¯ãç·åœ¢æ¹çšåŒç³»ãè§£ãããšã«ãã£ãŠãã¬ã€ãšäžè§åœ¢ã®äº€å·®ç¹ãèšç®ããŸããããã«ã¯ãäžè§åœ¢å ã®äº€å·®ç¹ã®äœçœ®ã決å®ããéå¿åº§æšã®èšç®ãå«ãŸããŸããéå¿åº§æšã[0, 1]ã®ç¯å²å ã«ããããã®åèšã1以äžã®å Žåãã¬ã€ã¯äžè§åœ¢ãšäº€å·®ããŸãã
GLSLã³ãŒãã®äŸïŒ
bool rayTriangleIntersect(Ray ray, vec3 v0, vec3 v1, vec3 v2, out float t) {
vec3 edge1 = v1 - v0;
vec3 edge2 = v2 - v0;
vec3 h = cross(ray.direction, edge2);
float a = dot(edge1, h);
if (a > -0.0001 && a < 0.0001)
return false; // Ray is parallel to triangle
float f = 1.0 / a;
vec3 s = ray.origin - v0;
float u = f * dot(s, h);
if (u < 0.0 || u > 1.0)
return false;
vec3 q = cross(s, edge1);
float v = f * dot(ray.direction, q);
if (v < 0.0 || u + v > 1.0)
return false;
// At this stage we can compute t to find out where the intersection point is on the line.
t = f * dot(edge2, q);
if (t > 0.0001) // ray intersection
{
return true;
}
else // This means that there is a line intersection but not a ray intersection.
return false;
}
ã·ã§ãŒãã£ã³ã°ãšã©ã€ãã£ã³ã°
亀差ç¹ãèŠã€ãã£ãããæ¬¡ã®ã¹ãããã¯ãã¯ã»ã«ã®è²ãèšç®ããããšã§ããããã«ã¯ã亀差ç¹ã§å ã衚é¢ãšã©ã®ããã«çžäºäœçšããããæ±ºå®ããããšãå«ãŸããŸããäžè¬çãªã·ã§ãŒãã£ã³ã°ã¢ãã«ã«ã¯ã次ã®ãã®ããããŸãïŒ
- ãã©ã³ã·ã§ãŒãã£ã³ã°ïŒ å ã®æ¡æ£æåãšé¡é¢åå°æåãèšç®ããåçŽãªã·ã§ãŒãã£ã³ã°ã¢ãã«ã
- Blinn-Phongã·ã§ãŒãã£ã³ã°ïŒ é¡é¢åå°æåãèšç®ããããã«ããŒããŠã§ã€ãã¯ãã«ã䜿çšããããã©ã³ã·ã§ãŒãã£ã³ã°ã®æ¹è¯çã
- ç©çããŒã¹ã¬ã³ããªã³ã°ïŒPBRïŒïŒ ãããªã¢ã«ã®ç©ççç¹æ§ãèæ ®ã«å ¥ãããããçŸå®çãªã·ã§ãŒãã£ã³ã°ã¢ãã«ã
ã¬ã€ãã¬ãŒã·ã³ã°ã¯ãã°ããŒãã«ã€ã«ãããŒã·ã§ã³ãåå°ã屿ãªã©ãã©ã¹ã¿ã©ã€ãŒãŒã·ã§ã³ãããé«åºŠãªã©ã€ãã£ã³ã°å¹æãå¯èœã«ããŸãããããã®å¹æã¯ã亀差ç¹ãã远å ã®ã¬ã€ãæå°ããããšã§å®è£ ã§ããŸãã
äŸïŒæ¡æ£å ã®èšç®
vec3 calculateDiffuse(vec3 normal, vec3 lightDirection, vec3 objectColor) {
float diffuseIntensity = max(dot(normal, lightDirection), 0.0);
return diffuseIntensity * objectColor;
}
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ãšæé©å
ã¬ã€ãã¬ãŒã·ã³ã°ã¯èšç®è² è·ãé«ããWebGLã§ãªã¢ã«ã¿ã€ã ããã©ãŒãã³ã¹ãéæããã«ã¯æ éãªæé©åãå¿ èŠã§ãã以äžã«ããã€ãã®äž»èŠãªãã¯ããã¯ã瀺ããŸãïŒ
- é«éåæ§é ïŒ åè¿°ã®éããBVHã®ãããªé«éåæ§é ã䜿çšããããšã¯ã亀差å€å®ã®åæ°ãæžããããã«äžå¯æ¬ ã§ãã
- æ©æã¬ã€çµäºïŒ æçµçãªç»åã«å€§ããå¯äžããªãã¬ã€ã¯æ©æã«çµäºãããŸããããšãã°ãã·ã£ããŠã¬ã€ã¯ãªããžã§ã¯ãã«åœãã£ãç¬éã«çµäºãããããšãã§ããŸãã
- é©å¿ãµã³ããªã³ã°ïŒ ã·ãŒã³ã®è€éãã«å¿ããŠããã¯ã»ã«ãããã®ãµã³ãã«æ°ãå¯å€ã«ããŸãããã£ããŒã«ãå€ãé åãè€éãªã©ã€ãã£ã³ã°ã®ããé åã¯ãããå€ãã®ãµã³ãã«ã§ã¬ã³ããªã³ã°ã§ããŸãã
- ããã€ãžã³ã°ïŒ ããã€ãžã³ã°ã¢ã«ãŽãªãºã ã䜿çšããŠã¬ã³ããªã³ã°ç»åã®ãã€ãºãäœæžãããã¯ã»ã«ãããã®ãµã³ãã«æ°ãæžããããšãå¯èœã«ããŸãã
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒã®æé©åïŒ ã¡ã¢ãªã¢ã¯ã»ã¹ãæå°éã«æãããã¯ãã«æŒç®ã䜿çšããåå²ãé¿ããããšã§ãã³ã³ãã¥ãŒãã·ã§ãŒããŒã®ã³ãŒããæé©åããŸãã
- ã¯ãŒã¯ã°ã«ãŒããµã€ãºã®èª¿æŽïŒ ããŸããŸãªã¯ãŒã¯ã°ã«ãŒããµã€ãºã詊ããŠãã¿ãŒã²ããGPUã«æé©ãªæ§æãèŠã€ããŸãã
- ããŒããŠã§ã¢ã¬ã€ãã¬ãŒã·ã³ã°ã®äœ¿çšïŒå©çšå¯èœãªå ŽåïŒïŒ äžéšã®GPUã¯çŸåšãã¬ã€ãã¬ãŒã·ã³ã°å°çšã®ããŒããŠã§ã¢ãæäŸããŠããŸããWebGLã§ãã®æ©èœãå ¬éããæ¡åŒµæ©èœã確èªããæŽ»çšããŸãã
ã°ããŒãã«ãªäŸãšå¿çš
WebGLã«ãããã¬ã€ãã¬ãŒã·ã³ã°ã¯ãäžçäžã®ããŸããŸãªç£æ¥ã§æ°å€ãã®æœåšçãªå¿çšããããŸãïŒ
- ã²ãŒã ïŒ ãªã¢ã«ãªã©ã€ãã£ã³ã°ãåå°ã圱ã§ãŠã§ãããŒã¹ã®ã²ãŒã ã®èŠèŠçå¿ å®åºŠãåäžãããŸãã
- 補åã®å¯èŠåïŒ eã³ããŒã¹ãããŒã±ãã£ã³ã°åãã«ãåå®çãªã¬ã³ããªã³ã°ã§è£œåã®ã€ã³ã¿ã©ã¯ãã£ããª3Dã¢ãã«ãäœæããŸããããšãã°ãã¹ãŠã§ãŒãã³ã®å®¶å ·äŒç€Ÿãã顧客ãèªå® ã§æ£ç¢ºãªç §æãšåå°ã§å®¶å ·ãèŠèŠåã§ããããã«ããããšãå¯èœã§ãã
- 建ç¯ã®å¯èŠåïŒ ãªã¢ã«ãªç §æãšãããªã¢ã«ã§å»ºç¯ãã¶ã€ã³ãå¯èŠåããŸããããšãã°ãããã€ã®å»ºç¯äºåæããæ£ç¢ºãªå€ªéœå ãšåœ±ã®ã·ãã¥ã¬ãŒã·ã§ã³ã§å»ºç©ã®ãã¶ã€ã³ãæ«é²ããããã«ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšã§ããŸãã
- ããŒãã£ã«ãªã¢ãªãã£ïŒVRïŒãšæ¡åŒµçŸå®ïŒARïŒïŒ ã¬ã€ãã¬ãŒã·ã³ã°å¹æãåãå ¥ããããšã§ãVRããã³ARäœéšã®ãªã¢ãªãºã ãåäžãããŸããããšãã°ããã³ãã³ã®åç©é€šããã¬ã€ãã¬ãŒã·ã³ã°ã«ãã£ãŠåŒ·åãããèŠèŠçãã£ããŒã«ãæã€VRãã¢ãŒãæäŸã§ããŸãã
- ç§åŠçå¯èŠåïŒ è€éãªç§åŠããŒã¿ããªã¢ã«ãªã¬ã³ããªã³ã°æè¡ã§å¯èŠåããŸããããšãã°ãæ¥æ¬ã®ç ç©¶æããååæ§é ãæ£ç¢ºãªç §æãšåœ±ã§å¯èŠåããããã«ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšã§ããŸãã
- æè²ïŒ å åŠãšå 茞éã®åçãå®èšŒããã€ã³ã¿ã©ã¯ãã£ããªæè²ããŒã«ãéçºããŸãã
課é¡ãšå°æ¥ã®æ¹åæ§
WebGLã§ã®ãªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ã¯ãŸããŸãå®çŸå¯èœã«ãªã£ãŠããŸãããããã€ãã®èª²é¡ãæ®ã£ãŠããŸãïŒ
- ããã©ãŒãã³ã¹ïŒ è€éãªã·ãŒã³ã§é«ããã¬ãŒã ã¬ãŒããéæããããšã¯äŸç¶ãšããŠèª²é¡ã§ãã
- è€éãïŒ æ¬æ Œçãªã¬ã€ãã¬ãŒãµãŒãå®è£ ããã«ã¯ãçžåœãªããã°ã©ãã³ã°ã®åŽåãå¿ èŠã§ãã
- ããŒããŠã§ã¢ãµããŒãïŒ ãã¹ãŠã®GPUãã³ã³ãã¥ãŒãã·ã§ãŒããŒãããŒããŠã§ã¢ã¬ã€ãã¬ãŒã·ã³ã°ã«å¿ èŠãªæ¡åŒµæ©èœããµããŒãããŠããããã§ã¯ãããŸããã
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã®å°æ¥ã®æ¹åæ§ã«ã¯ã次ã®ãã®ãå«ãŸããŸãïŒ
- ããŒããŠã§ã¢ãµããŒãã®åäžïŒ ããå€ãã®GPUãå°çšã®ã¬ã€ãã¬ãŒã·ã³ã°ããŒããŠã§ã¢ãæèŒããã«ã€ããŠãããã©ãŒãã³ã¹ã¯å€§å¹ ã«åäžããŸãã
- æšæºåãããAPIïŒ WebGLã§ã®ããŒããŠã§ã¢ã¬ã€ãã¬ãŒã·ã³ã°ã®ããã®æšæºåãããAPIã®éçºã¯ãå®è£ ããã»ã¹ãç°¡çŽ åããŸãã
- é«åºŠãªããã€ãžã³ã°æè¡ïŒ ããæŽç·Žãããããã€ãžã³ã°ã¢ã«ãŽãªãºã ã«ãããããå°ãªããµã³ãã«ã§é«å質ã®ç»åãå¯èœã«ãªããŸãã
- WebAssemblyïŒWasmïŒãšã®çµ±åïŒ ã¬ã€ãã¬ãŒãµãŒã®èšç®è² è·ã®é«ãéšåãå®è£ ããããã«WebAssemblyã䜿çšããããšã§ãããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã
çµè«
WebGLã§ã³ã³ãã¥ãŒãã·ã§ãŒããŒã䜿çšãããªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ã¯ããŠã§ãã°ã©ãã£ãã¯ã¹ã«é©åœãããããå¯èœæ§ãç§ãããæ¥éã«é²åããŠããåéã§ããã¬ã€ãã¬ãŒã·ã³ã°ã®åºç€ãçè§£ããã³ã³ãã¥ãŒãã·ã§ãŒããŒã®èœåãæŽ»çšããæé©åæè¡ãçšããããšã§ãéçºè ã¯ãã€ãŠãŠã§ããã©ãŠã¶ã§ã¯äžå¯èœãšèããããŠããèŠäºãªèŠèŠäœéšãåµé ã§ããŸããããŒããŠã§ã¢ãšãœãããŠã§ã¢ãæ¹åãç¶ããã«ã€ããŠãä»åŸæ°å¹Žéã§ããŠã§ãäžã§ã®ã¬ã€ãã¬ãŒã·ã³ã°ã®ããã«å°è±¡çãªå¿çšãèŠãããããšãæåŸ ãããããã¯ææ°ã®ãã©ãŠã¶ãåããããããããã€ã¹ããäžçäžã®ãªãŒãã£ãšã³ã¹ã«ã¢ã¯ã»ã¹å¯èœã«ãªãã§ãããã
ãã®ã¬ã€ãã¯ãWebGLã§ã®ãªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ã®å®è£ ã«é¢ããæŠå¿µãšæè¡ã®å æ¬çãªæŠèŠãæäŸããŸãããäžçäžã®éçºè ããããã®æè¡ã詊ãããŠã§ãã°ã©ãã£ãã¯ã¹ã®é²æ©ã«è²¢ç®ããããšã奚å±ããŸãã