WebGLã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã®è©³çްãªè§£èª¬ãWebããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã«ãããé«åºŠãªã€ã«ãããŒã·ã§ã³ç®¡çã®ããã®å©ç¹ãå®è£ ãããã³æé©åã«ã€ããŠæ¢ããŸãã
WebGLã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ïŒé«åºŠãªã€ã«ãããŒã·ã§ã³ç®¡ç
ãªã¢ã«ã¿ã€ã 3Dã°ã©ãã£ãã¯ã¹ã®é åã§ã¯ãã©ã€ãã£ã³ã°ã¯ãªã¢ã«ã§èŠèŠçã«é åçãªã·ãŒã³ãäœæããäžã§æ¥µããŠéèŠãªåœ¹å²ãæãããŸããåŸæ¥ã®ãã©ã¯ãŒãã¬ã³ããªã³ã°ã¢ãããŒãã¯ã倿°ã®å æºããããšèšç®ã³ã¹ããé«ããªãå¯èœæ§ããããŸããããã£ãã¡ãŒãã¬ã³ããªã³ã°ã¯é åçãªä»£æ¿ææ®µãæäŸããŸããã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ããããããã«äžæ©é²ããWebGLã¢ããªã±ãŒã·ã§ã³ã§è€éãªã©ã€ãã£ã³ã°ã·ããªãªã管çããããã®å¹ççã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
ãã£ãã¡ãŒãã¬ã³ããªã³ã°ã®çè§£
ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã«å ¥ãåã«ããã£ãã¡ãŒãã¬ã³ããªã³ã°ã®ã³ã¢ååãçè§£ããããšãéèŠã§ããåãã©ã°ã¡ã³ãïŒãã¯ã»ã«ïŒãã©ã¹ã¿ã©ã€ãºããããšãã«ã©ã€ãã£ã³ã°ãèšç®ãããã©ã¯ãŒãã¬ã³ããªã³ã°ãšã¯ç°ãªãããã£ãã¡ãŒãã¬ã³ããªã³ã°ã¯ãžãªã¡ããªãã¹ãšã©ã€ãã£ã³ã°ãã¹ãåé¢ããŸãã以äžã«å èš³ã瀺ããŸãã
- ãžãªã¡ããªãã¹ïŒGãããã¡ã®äœæïŒïŒæåã®ãã¹ã§ã¯ãã·ãŒã³ã®ãžãªã¡ããªãè€æ°ã®ã¬ã³ããŒã¿ãŒã²ããã«ã¬ã³ããªã³ã°ãããŸãããããã¯ãŸãšããŠGãããã¡ãšåŒã°ããŸãããã®ãããã¡ã«ã¯éåžžãæ¬¡ã®æ
å ±ãæ ŒçŽãããŸãïŒ
- 深床ïŒã«ã¡ã©ãã衚é¢ãŸã§ã®è·é¢ã
- æ³ç·ïŒè¡šé¢ã®åãã
- ã¢ã«ããïŒè¡šé¢ã®åºæ¬è²ã
- ã¹ããã¥ã©ïŒã¹ããã¥ã©ãã€ã©ã€ãã®è²ãšåŒ·åºŠã
- ã©ã€ãã£ã³ã°ãã¹ïŒ2çªç®ã®ãã¹ã§ã¯ãGãããã¡ã䜿çšããŠåãã¯ã»ã«ã®ã©ã€ãã£ã³ã°ã®å¯äžãèšç®ããŸããããã«ãããå¿ èŠãªãã¹ãŠã®è¡šé¢æ å ±ãåŸããããŸã§ãã³ã¹ãã®ãããã©ã€ãã£ã³ã°èšç®ãå»¶æã§ããŸãã
ãã£ãã¡ãŒãã¬ã³ããªã³ã°ã«ã¯ããã€ãã®å©ç¹ããããŸãïŒ
- ãªãŒããŒãããŒã®åæžïŒã©ã€ãã£ã³ã°èšç®ã¯ã圱é¿ãäžããå æºã®æ°ã«é¢ä¿ãªãããã¯ã»ã«ããšã«1åã ãå®è¡ãããŸãã
- ç°¡ç¥åãããã©ã€ãã£ã³ã°èšç®ïŒå¿ èŠãªãã¹ãŠã®è¡šé¢æ å ±ãGãããã¡ã§ããã«å©çšã§ãããããã©ã€ãã£ã³ã°æ¹çšåŒãç°¡ç¥åãããŸãã
- ãžãªã¡ããªãšã©ã€ãã£ã³ã°ã®åé¢ïŒããã«ãããããæè»ã§ã¢ãžã¥ãŒã«åãããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãå¯èœã«ãªããŸãã
ãã ããæšæºã®ãã£ãã¡ãŒãã¬ã³ããªã³ã°ã§ããéåžžã«å€ãã®å æºãæ±ãå Žåã«èª²é¡ã«çŽé¢ããå¯èœæ§ããããŸããããã§ãã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ãç»å ŽããŸãã
ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã®ç޹ä»
ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ãç¹ã«å€æ°ã®å æºãããã·ãŒã³ã§ããã£ãã¡ãŒãã¬ã³ããªã³ã°ã®ããã©ãŒãã³ã¹ãåäžãããããšãç®çãšããæé©åææ³ã§ããã³ã¢ã¢ã€ãã¢ã¯ãèŠéå°ã3Dã¯ã©ã¹ã¿ã®ã°ãªããã«åå²ãã空éçãªå Žæã«åºã¥ããŠãããã®ã¯ã©ã¹ã¿ã«ã©ã€ããå²ãåœãŠãããšã§ããããã«ãããã©ã€ãã£ã³ã°ãã¹äžã«ã©ã®ã©ã€ããã©ã®ãã¯ã»ã«ã«åœ±é¿ãäžããããå¹ççã«å€æã§ããŸãã
ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã®ä»çµã¿
- èŠéå°ã®çްåå²ïŒèŠéå°ã¯ã3Dã¯ã©ã¹ã¿ã®ã°ãªããã«åå²ãããŸãããã®ã°ãªããã®å¯žæ³ïŒäŸïŒ16x9x16ïŒã¯ãã¯ã©ã¹ã¿ãªã³ã°ã®ç²åºŠã決å®ããŸãã
- ã©ã€ãã®å²ãåœãŠïŒåå æºã¯ã亀差ããã¯ã©ã¹ã¿ã«å²ãåœãŠãããŸããããã¯ãã©ã€ãã®ããŠã³ãã£ã³ã°ããªã¥ãŒã ãã¯ã©ã¹ã¿ã®å¢çã«å¯ŸããŠãã§ãã¯ããããšã§å®è¡ã§ããŸãã
- ã¯ã©ã¹ã¿ã©ã€ããªã¹ãã®äœæïŒåã¯ã©ã¹ã¿ã«ã€ããŠã圱é¿ãäžããã©ã€ãã®ãªã¹ããäœæãããŸãããã®ãªã¹ãã¯ããããã¡ãŸãã¯ãã¯ã¹ãã£ã«æ ŒçŽã§ããŸãã
- ã©ã€ãã£ã³ã°ãã¹ïŒã©ã€ãã£ã³ã°ãã¹äžããã¯ã»ã«ããšã«ãã©ã®ã¯ã©ã¹ã¿ã«å±ããŠãããã倿ãããã®ã¯ã©ã¹ã¿ã®ã©ã€ããªã¹ãå ã®ã©ã€ããå埩åŠçããŸããããã«ããããã¯ã»ã«ããšã«èæ ®ããå¿ èŠãããã©ã€ãã®æ°ãå€§å¹ ã«åæžãããŸãã
ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã®å©ç¹
- ããã©ãŒãã³ã¹ã®åäžïŒãã¯ã»ã«ããšã«èæ ®ãããã©ã€ãã®æ°ãæžããããšã§ãã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ãç¹ã«å€æ°ã®å æºãããã·ãŒã³ã§ãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒããã©ãŒãã³ã¹ã®åäžã¯ãå æºã®æ°ãå¢ããã«ã€ããŠããé¡èã«ãªããè€éãªã©ã€ãã£ã³ã°ã·ããªãªã«å¯Ÿããã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ã«ãªããŸãã
- ãªãŒããŒãããŒã®åæžïŒæšæºã®ãã£ãã¡ãŒãã¬ã³ããªã³ã°ãšåæ§ã«ãã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ããã¯ã»ã«ããšã«1åã ãã©ã€ãã£ã³ã°èšç®ãå®è¡ããããšã§ããªãŒããŒãããŒãåæžããŸãã
WebGLã§ã®ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã®å®è£
WebGLã§ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ãå®è£ ããã«ã¯ãããã€ãã®æé ãå¿ èŠã§ããããã»ã¹ã®äžäœã¬ãã«ã®æŠèŠã以äžã«ç€ºããŸãã
- Gãããã¡ã®äœæïŒå¿ èŠãªè¡šé¢æ å ±ïŒæ·±åºŠãæ³ç·ãã¢ã«ãããã¹ããã¥ã©ïŒãæ ŒçŽããããã®Gãããã¡ãã¯ã¹ãã£ãäœæããŸãã ããã«ã¯éåžžãè€æ°ã®ã¬ã³ããŒã¿ãŒã²ããïŒMRTïŒã®äœ¿çšãå«ãŸããŸãã
- ã¯ã©ã¹ã¿ã®çæïŒã¯ã©ã¹ã¿ã°ãªãããå®çŸ©ããã¯ã©ã¹ã¿å¢çãèšç®ããŸãã ããã¯ãJavaScriptãŸãã¯ã·ã§ãŒããŒã§çŽæ¥å®è¡ã§ããŸãã
- ã©ã€ãã®å²ãåœãŠïŒCPUåŽïŒïŒå æºãå埩åŠçããé©åãªã¯ã©ã¹ã¿ã«å²ãåœãŠãŸãã ããã¯éåžžãã©ã€ããç§»åãŸãã¯å€æŽããããšãã«ã®ã¿èšç®ããå¿ èŠããããããCPUã§å®è¡ãããŸãã ç¹ã«å€æ°ã®ã©ã€ããããå Žåã¯ã空éå éæ§é ïŒããŠã³ãã£ã³ã°ããªã¥ãŒã éå±€ãã°ãªãããªã©ïŒã䜿çšããŠãã©ã€ãã®å²ãåœãŠããã»ã¹ãé«éåããããšãæ€èšããŠãã ããã
- ã¯ã©ã¹ã¿ã©ã€ããªã¹ãã®äœæïŒGPUåŽïŒïŒåã¯ã©ã¹ã¿ã®ã©ã€ããªã¹ããæ ŒçŽããããã®ãããã¡ãŸãã¯ãã¯ã¹ãã£ãäœæããŸãã CPUããGPUã«åã¯ã©ã¹ã¿ã«å²ãåœãŠãããã©ã€ãã€ã³ããã¯ã¹ã転éããŸãã ããã¯ãWebGLã®ããŒãžã§ã³ãšå©çšå¯èœãªæ¡åŒµæ©èœã«å¿ããŠããã¯ã¹ãã£ãããã¡ãªããžã§ã¯ãïŒTBOïŒãŸãã¯ã¹ãã¬ãŒãžãããã¡ãªããžã§ã¯ãïŒSBOïŒã䜿çšããŠå®çŸã§ããŸãã
- ã©ã€ãã£ã³ã°ãã¹ïŒGPUåŽïŒïŒGãããã¡ããèªã¿åãããã¯ã»ã«ããšã«ã¯ã©ã¹ã¿ã決å®ããã¯ã©ã¹ã¿ã®ã©ã€ããªã¹ãå ã®ã©ã€ããå埩åŠçããŠæçµçãªè²ãèšç®ããã©ã€ãã£ã³ã°ãã¹ã·ã§ãŒããŒãå®è£ ããŸãã
ã³ãŒãäŸïŒGLSLïŒ
å®è£ ã®éèŠãªéšåã瀺ãã³ãŒãã¹ãããããããã€ã瀺ããŸãã æ³šïŒãããã¯ç°¡ç¥åãããäŸã§ãããç¹å®ã®ããŒãºã«åºã¥ããŠèª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãã
Gãããã¡ãã©ã°ã¡ã³ãã·ã§ãŒããŒ
#version 300 es
in vec3 vNormal;
in vec2 vTexCoord;
layout (location = 0) out vec4 outAlbedo;
layout (location = 1) out vec4 outNormal;
layout (location = 2) out vec4 outSpecular;
uniform sampler2D uTexture;
void main() {
outAlbedo = texture(uTexture, vTexCoord);
outNormal = vec4(normalize(vNormal), 0.0);
outSpecular = vec4(0.5, 0.5, 0.5, 32.0); // Example specular color and shininess
}
ã©ã€ãã£ã³ã°ãã¹ãã©ã°ã¡ã³ãã·ã§ãŒããŒ
#version 300 es
in vec2 vTexCoord;
layout (location = 0) out vec4 outColor;
uniform sampler2D uAlbedo;
uniform sampler2D uNormal;
uniform sampler2D uSpecular;
uniform sampler2D uDepth;
uniform samplerBuffer uLightListBuffer;
uniform vec3 uLightPositions[MAX_LIGHTS];
uniform vec3 uLightColors[MAX_LIGHTS];
uniform int uClusterGridSizeX;
uniform int uClusterGridSizeY;
uniform int uClusterGridSizeZ;
uniform mat4 uInverseProjectionMatrix;
#define MAX_LIGHTS 256 //Example, needs to be defined and consistent
// Function to reconstruct world position from depth and screen coordinates
vec3 reconstructWorldPosition(float depth, vec2 screenCoord) {
vec4 clipSpacePosition = vec4(screenCoord * 2.0 - 1.0, depth, 1.0);
vec4 viewSpacePosition = uInverseProjectionMatrix * clipSpacePosition;
return viewSpacePosition.xyz / viewSpacePosition.w;
}
// Function to calculate cluster index based on world position
int calculateClusterIndex(vec3 worldPosition) {
// Transform world position to view space
vec4 viewSpacePosition = uInverseViewMatrix * vec4(worldPosition, 1.0);
// Calculate normalized device coordinates (NDC)
vec3 ndcPosition = viewSpacePosition.xyz / viewSpacePosition.w; //Perspective divide
//Transform to [0, 1] range
vec3 normalizedPosition = ndcPosition * 0.5 + 0.5;
// Clamp to avoid out-of-bounds access
normalizedPosition = clamp(normalizedPosition, vec3(0.0), vec3(1.0));
// Calculate the cluster index
int clusterX = int(normalizedPosition.x * float(uClusterGridSizeX));
int clusterY = int(normalizedPosition.y * float(uClusterGridSizeY));
int clusterZ = int(normalizedPosition.z * float(uClusterGridSizeZ));
// Calculate the 1D index
return clusterX + clusterY * uClusterGridSizeX + clusterZ * uClusterGridSizeX * uClusterGridSizeY;
}
void main() {
float depth = texture(uDepth, vTexCoord).r;
vec3 normal = normalize(texture(uNormal, vTexCoord).xyz);
vec3 albedo = texture(uAlbedo, vTexCoord).rgb;
vec4 specularData = texture(uSpecular, vTexCoord);
float shininess = specularData.a;
float specularIntensity = 0.5; // simplified specular intensity
// Reconstruct world position from depth
vec3 worldPosition = reconstructWorldPosition(depth, vTexCoord);
// Calculate cluster index
int clusterIndex = calculateClusterIndex(worldPosition);
// Determine the start and end indices of the light list for this cluster
int lightListOffset = clusterIndex * 2; // Assuming each cluster stores start and end indices
int startLightIndex = int(texelFetch(uLightListBuffer, lightListOffset).r * float(MAX_LIGHTS)); //Normalize light indices to [0, MAX_LIGHTS]
int numLightsInCluster = int(texelFetch(uLightListBuffer, lightListOffset + 1).r * float(MAX_LIGHTS));
// Accumulate lighting contributions
vec3 finalColor = vec3(0.0);
for (int i = 0; i < numLightsInCluster; ++i) {
int lightIndex = startLightIndex + i;
if (lightIndex >= MAX_LIGHTS) break; // Safety check to prevent out-of-bounds access
vec3 lightPosition = uLightPositions[lightIndex];
vec3 lightColor = uLightColors[lightIndex];
vec3 lightDirection = normalize(lightPosition - worldPosition);
float distanceToLight = length(lightPosition - worldPosition);
//Simple Diffuse Lighting
float diffuseIntensity = max(dot(normal, lightDirection), 0.0);
vec3 diffuse = diffuseIntensity * lightColor * albedo;
//Simple Specular Lighting
vec3 reflectionDirection = reflect(-lightDirection, normal);
float specularHighlight = pow(max(dot(reflectionDirection, normalize(-worldPosition)), 0.0), shininess);
vec3 specular = specularIntensity * specularHighlight * specularData.rgb * lightColor;
float attenuation = 1.0 / (distanceToLight * distanceToLight); // Simple attenuation
finalColor += (diffuse + specular) * attenuation;
}
outColor = vec4(finalColor, 1.0);
}
éèŠãªèæ ®äºé
- ã¯ã©ã¹ã¿ãµã€ãºïŒã¯ã©ã¹ã¿ãµã€ãºã®éžæã¯éèŠã§ããã¯ã©ã¹ã¿ãå°ããã»ã©ã«ãªã³ã°ãåäžããŸãããã¯ã©ã¹ã¿ã®æ°ãå¢ããã¯ã©ã¹ã¿ã©ã€ããªã¹ãã®ç®¡çã®ãªãŒããŒããããå¢å ããŸããã¯ã©ã¹ã¿ã倧ããã»ã©ãªãŒããŒãããã¯æžå°ããŸããããã¯ã»ã«ããšã«èæ ®ãããã©ã€ããå¢ããå¯èœæ§ããããŸããã·ãŒã³ã«æé©ãªã¯ã©ã¹ã¿ãµã€ãºãèŠã€ããã«ã¯ãå®éšãéèŠã§ãã
- ã©ã€ãå²ãåœãŠã®æé©åïŒã©ã€ãå²ãåœãŠããã»ã¹ã®æé©åã¯ãããã©ãŒãã³ã¹ã«äžå¯æ¬ ã§ãã空éããŒã¿æ§é ïŒããŠã³ãã£ã³ã°ããªã¥ãŒã éå±€ãã°ãªãããªã©ïŒã䜿çšãããšãã©ã€ãã亀差ããã¯ã©ã¹ã¿ãèŠã€ããããã»ã¹ãå€§å¹ ã«é«éåã§ããŸãã
- ã¡ã¢ãªåž¯åå¹ ïŒGãããã¡ãšã¯ã©ã¹ã¿ã©ã€ããªã¹ãã«ã¢ã¯ã»ã¹ãããšãã¯ãã¡ã¢ãªåž¯åå¹ ã«æ³šæããŠãã ãããé©åãªãã¯ã¹ãã£åœ¢åŒãšå§çž®æè¡ã䜿çšãããšãã¡ã¢ãªäœ¿çšéãåæžã§ããŸãã
- WebGLã®å¶éäºé ïŒå€ãWebGLããŒãžã§ã³ã«ã¯ãç¹å®ã®æ©èœïŒã¹ãã¬ãŒãžãããã¡ãªããžã§ã¯ããªã©ïŒããªãå ŽåããããŸããã©ã€ããªã¹ããæ ŒçŽããããã«ãæ¡åŒµæ©èœãŸãã¯ä»£æ¿ã¢ãããŒãã®äœ¿çšãæ€èšããŠãã ããã å®è£ ãã¿ãŒã²ããWebGLããŒãžã§ã³ãšäºææ§ãããããšã確èªããŠãã ããã
- ã¢ãã€ã«ããã©ãŒãã³ã¹ïŒã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ãç¹ã«ã¢ãã€ã«ããã€ã¹ã§ã¯èšç®è² è·ãé«ããªãå¯èœæ§ããããŸãã ã³ãŒããæ³šææ·±ããããã¡ã€ãªã³ã°ããããã©ãŒãã³ã¹ãæé©åããŸãã ã¢ãã€ã«ã§ã¯ãããäœãè§£å床ãŸãã¯ç°¡ç¥åãããã©ã€ãã£ã³ã°ã¢ãã«ã®äœ¿çšãæ€èšããŠãã ããã
æé©åææ³
WebGLã§ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ãããã«æé©åããããã«ãããã€ãã®ææ³ã䜿çšã§ããŸãã
- èŠéå°ã«ãªã³ã°ïŒã©ã€ããã¯ã©ã¹ã¿ã«å²ãåœãŠãåã«ãèŠéå°ã®å€ã«å®å šã«ããã©ã€ããç Žæ£ããããã«ãèŠéå°ã«ãªã³ã°ãå®è¡ããŸãã
- è£é¢ã«ãªã³ã°ïŒãžãªã¡ããªãã¹äžã«è£é¢äžè§åœ¢ãã«ãªã³ã°ããŠãGãããã¡ã«æžã蟌ãŸããããŒã¿éãåæžããŸãã
- 詳现ã¬ãã«ïŒLODïŒïŒã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠãã¢ãã«ã«ç°ãªã詳现ã¬ãã«ã䜿çšããŸãã ããã«ãããã¬ã³ããªã³ã°ããå¿ èŠããããžãªã¡ããªã®éãå€§å¹ ã«åæžã§ããŸãã
- ãã¯ã¹ãã£å§çž®ïŒãã¯ã¹ãã£å§çž®æè¡ïŒASTCãªã©ïŒã䜿çšããŠããã¯ã¹ãã£ã®ãµã€ãºãåæžããã¡ã¢ãªåž¯åå¹ ãåäžãããŸãã
- ã·ã§ãŒããŒã®æé©åïŒã·ã§ãŒããŒã³ãŒããæé©åããŠãåœä»€æ°ãåæžããããã©ãŒãã³ã¹ãåäžãããŸãã ããã«ã¯ãã«ãŒãã¢ã³ããŒãªã³ã°ãåœä»€ã¹ã±ãžã¥ãŒãªã³ã°ãåå²ã®æå°åãªã©ã®ææ³ãå«ãŸããŸãã
- äºåèšç®ãããã©ã€ãã£ã³ã°ïŒéçãªããžã§ã¯ãã®äºåèšç®ãããã©ã€ãã£ã³ã°æè¡ïŒã©ã€ãããããçé¢èª¿å颿°ãªã©ïŒã®äœ¿çšãæ€èšããŠããªã¢ã«ã¿ã€ã ã®ã©ã€ãã£ã³ã°èšç®ãåæžããŸãã
- ããŒããŠã§ã¢ã€ã³ã¹ã¿ã³ã¹åïŒåããªããžã§ã¯ãã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãããå Žåã¯ãããŒããŠã§ã¢ã€ã³ã¹ã¿ã³ã¹åã䜿çšããŠãããå¹ççã«ã¬ã³ããªã³ã°ããŸãã
ä»£æ¿ææ®µãšãã¬ãŒããªã
ã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯å€§ããªå©ç¹ãæäŸããŸãããä»£æ¿ææ®µãšããããã®ãã¬ãŒããªããæ€èšããããšãéèŠã§ãã
- ãã©ã¯ãŒãã¬ã³ããªã³ã°ïŒã©ã€ããå€ãå Žåã¯å¹çãäœäžããŸããããã©ã¯ãŒãã¬ã³ããªã³ã°ã¯å®è£ ãç°¡åã§ãå æºã®æ°ãéãããŠããã·ãŒã³ã«é©ããŠããå ŽåããããŸãã ãŸããéæåºŠãããç°¡åã«å®çŸã§ããŸãã
- ãã©ã¯ãŒã+ã¬ã³ããªã³ã°ïŒãã©ã¯ãŒã+ã¬ã³ããªã³ã°ã¯ããã£ãã¡ãŒãã¬ã³ããªã³ã°ã®ä»£æ¿ææ®µã§ãããã³ã³ãã¥ãŒãã·ã§ãŒããŒã䜿çšããŠãã©ã¯ãŒãã¬ã³ããªã³ã°ãã¹ã®åã«ã©ã€ãã«ãªã³ã°ãå®è¡ããŸãã ããã«ãããã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ãšåæ§ã®ããã©ãŒãã³ã¹äžã®å©ç¹ãåŸãããŸãã å®è£ ãããè€éã«ãªãå¯èœæ§ããããç¹å®ã®ããŒããŠã§ã¢æ©èœãå¿ èŠã«ãªãå ŽåããããŸãã
- ã¿ã€ã«åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ïŒã¿ã€ã«åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ãç»é¢ã3Dã¯ã©ã¹ã¿ã§ã¯ãªã2Dã¿ã€ã«ã«åå²ããŸãã ããã¯ãã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ãããå®è£ ãç°¡åã§ããã奥è¡ãã®å€åã倧ããã·ãŒã³ã§ã¯å¹çãäœäžããå¯èœæ§ããããŸãã
ã¬ã³ããªã³ã°ææ³ã®éžæã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«ãã£ãŠç°ãªããŸãã å æºã®æ°ãã·ãŒã³ã®è€éããããã³æ±ºå®ãäžãéã®ã¿ãŒã²ããããŒããŠã§ã¢ãæ€èšããŠãã ããã
çµè«
WebGLã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ãWebããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã§è€éãªã©ã€ãã£ã³ã°ã·ããªãªã管çããããã®åŒ·åãªææ³ã§ãã ã©ã€ããå¹ççã«ã«ãªã³ã°ãããªãŒããŒãããŒãåæžããããšã§ãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãå€§å¹ ã«åäžãããããšãã§ããŸãã å®è£ ã¯è€éã«ãªãå¯èœæ§ããããŸãããããã©ãŒãã³ã¹ãšç»è³ªã®ç¹ã§ã¡ãªããããããããã²ãŒã ãã·ãã¥ã¬ãŒã·ã§ã³ãèŠèŠåãªã©ã®èŠæ±ã®å³ããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠã¯äŸ¡å€ã®ããåãçµã¿ã§ãã æé©ãªçµæãåŸãã«ã¯ãã¯ã©ã¹ã¿ãµã€ãºãã©ã€ãå²ãåœãŠã®æé©åãããã³ã¡ã¢ãªåž¯åå¹ ãæ éã«æ€èšããããšãéèŠã§ãã
WebGLãé²åããããŒããŠã§ã¢æ©èœãåäžãç¶ããã«ã€ããŠãã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ã¯ãèŠèŠçã«çŽ æŽãããããã©ãŒãã³ã¹ã®é«ãWebããŒã¹ã®3Dãšã¯ã¹ããªãšã³ã¹ãäœæããããšããéçºè ã«ãšã£ãŠããŸããŸãéèŠãªããŒã«ã«ãªãã§ãããã
åèè³æ
- WebGL仿§ïŒ https://www.khronos.org/webgl/
- OpenGL InsightsïŒãã£ãã¡ãŒãã¬ã³ããªã³ã°ãã¯ã©ã¹ã¿åã·ã§ãŒãã£ã³ã°ãªã©ãé«åºŠãªã¬ã³ããªã³ã°ææ³ã«é¢ããç« ãå«ãæ¬ã
- ç ç©¶è«æïŒ Google Scholarãªã©ã®ããŒã¿ããŒã¹ã§ãã¯ã©ã¹ã¿åãã£ãã¡ãŒãã©ã€ãã£ã³ã°ããã³é¢é£ãããã¯ã«é¢ããåŠè¡è«æãæ€çŽ¢ããŸãã