WebGLã·ã§ãŒããŒãããã¹ã¯ããæè¡ãæ¢æ±ãããŒãžã®ãªããŒããªãã§ãåçãªããžã¥ã¢ã«ãã€ã³ã¿ã©ã¯ãã£ããªãšãã§ã¯ããã·ãŒã ã¬ã¹ãªæŽæ°ãå®çŸããå®è¡æã·ã§ãŒããŒçœ®ãæãããã¹ããã©ã¯ãã£ã¹ãæé©åæŠç¥ãå®è£ äŸãåŠã¶ã
WebGLã·ã§ãŒããŒãããã¹ã¯ããïŒåçãªããžã¥ã¢ã«ãå®çŸããå®è¡æã·ã§ãŒããŒçœ®ãæã
WebGLã¯WebããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã«é©åœããããããéçºè ããã©ãŠã¶å ã§çŽæ¥æ²¡å ¥å3Däœéšãäœæããããšãå¯èœã«ããŸãããåçã§ã€ã³ã¿ã©ã¯ãã£ããªWebGLã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éèŠãªãã¯ããã¯ã¯ãå®è¡æã·ã§ãŒããŒçœ®ãæããšããŠãç¥ãããã·ã§ãŒããŒãããã¹ã¯ããã§ããããã«ãããããŒãžã®åèªã¿èŸŒã¿ãã¬ã³ããªã³ã°ããã»ã¹ã®åèµ·åãå¿ èŠãšããããã®å Žã§ã·ã§ãŒããŒã倿Žããã³æŽæ°ã§ããŸãããã®ããã°æçš¿ã§ã¯ãWebGLã·ã§ãŒããŒãããã¹ã¯ããã®å©ç¹ãå®è£ ã®è©³çްããã¹ããã©ã¯ãã£ã¹ãæé©åæŠç¥ã«ã€ããŠå æ¬çãªã¬ã€ããæäŸããŸãã
ã·ã§ãŒããŒãããã¹ã¯ãããšã¯ïŒ
ã·ã§ãŒããŒãããã¹ã¯ãããšã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã«ãããŠãçŸåšã¢ã¯ãã£ããªã·ã§ãŒããŒããã°ã©ã ããã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«æ°ããã·ã§ãŒããŒãŸãã¯å€æŽãããã·ã§ãŒããŒã«çœ®ãæããæ©èœã®ããšã§ããåŸæ¥ãã·ã§ãŒããŒãæŽæ°ããã«ã¯ã¬ã³ããªã³ã°ãã€ãã©ã€ã³å šäœãåèµ·åããå¿ èŠããããç®ã«èŠããèŠèŠçãªäžå ·åãäžæãçºçããŠããŸãããã·ã§ãŒããŒãããã¹ã¯ããã¯ãã·ãŒã ã¬ã¹ã§ç¶ç¶çãªæŽæ°ãå¯èœã«ããããšã§ãã®å¶éãå æãã以äžã®çšéã§éåžžã«è²Žéã§ãã
- ã€ã³ã¿ã©ã¯ãã£ããªèŠèŠå¹æïŒãŠãŒã¶ãŒå ¥åããªã¢ã«ã¿ã€ã ããŒã¿ã«å¿ããŠã·ã§ãŒããŒã倿ŽããåçãªèŠèŠå¹æãäœæããŸãã
- è¿ éãªãããã¿ã€ãã³ã°ïŒå€æŽããšã«ã¢ããªã±ãŒã·ã§ã³ãåèµ·åãããªãŒããŒããããªãã«ãã·ã§ãŒããŒã³ãŒããè¿ éãã€å®¹æã«å埩éçºããŸãã
- ã©ã€ãã³ãŒãã£ã³ã°ãšããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ïŒãªã¢ã«ã¿ã€ã ã§ã·ã§ãŒããŒãã©ã¡ãŒã¿ãšã¢ã«ãŽãªãºã ã詊ããŠãããã©ãŒãã³ã¹ãæé©åããèŠèŠå質ã埮調æŽããŸãã
- ããŠã³ã¿ã€ã ãªãã®ã³ã³ãã³ãæŽæ°ïŒãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäžæããããšãªããèŠèŠã³ã³ãã³ãããšãã§ã¯ããåçã«æŽæ°ããŸãã
- èŠèŠã¹ã¿ã€ã«ã®A/Bãã¹ãïŒç°ãªãã·ã§ãŒããŒå®è£ éãã·ãŒã ã¬ã¹ã«åãæ¿ããŠããªã¢ã«ã¿ã€ã ã§èŠèŠã¹ã¿ã€ã«ããã¹ãããã³æ¯èŒããçŸåŠã«é¢ãããŠãŒã¶ãŒãã£ãŒãããã¯ãåéããŸãã
ã·ã§ãŒããŒãããã¹ã¯ããã䜿çšããçç±
ã·ã§ãŒããŒãããã¹ã¯ããã®å©äŸ¿æ§ã¯ãåãªãå©äŸ¿æ§ãè¶ ããŠããŸããããã¯éçºã¯ãŒã¯ãããŒãšå šäœçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«å€§ãã圱é¿ããŸããäž»ãªå©ç¹ãããã€ã玹ä»ããŸãã
- éçºã¯ãŒã¯ãããŒã®æ¹åïŒã€ãã¬ãŒã·ã§ã³ãµã€ã¯ã«ãççž®ããéçºè ãç°ãªãã·ã§ãŒããŒå®è£ ãè¿ éã«è©Šããçµæãããã«ç¢ºèªã§ããããã«ããŸããããã¯ãè¿ éãªãããã¿ã€ãã³ã°ãäžå¯æ¬ ãªã¯ãªãšã€ãã£ãã³ãŒãã£ã³ã°ãèŠèŠå¹æéçºã«ãšã£ãŠç¹ã«æçã§ãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒåçãªèŠèŠå¹æãšã·ãŒã ã¬ã¹ãªã³ã³ãã³ãæŽæ°ãå¯èœã«ããã¢ããªã±ãŒã·ã§ã³ãããé åçã§å¿çæ§ã®é«ããã®ã«ããŸãããŠãŒã¶ãŒã¯äžæãªãã«ãªã¢ã«ã¿ã€ã ã§å€æŽãäœéšã§ããããæ²¡å ¥æã®ãããšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸãã
- ããã©ãŒãã³ã¹æé©åïŒã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«ã·ã§ãŒããŒãã©ã¡ãŒã¿ãšã¢ã«ãŽãªãºã ã倿Žããããšã§ããªã¢ã«ã¿ã€ã ã®ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãå¯èœã«ããŸããéçºè ã¯ããã«ããã¯ãç¹å®ãããã®å Žã§ããã©ãŒãã³ã¹ãæé©åã§ãããããããã¹ã ãŒãºã§å¹ççãªã¬ã³ããªã³ã°ã«ã€ãªãããŸãã
- ã©ã€ãã³ãŒãã£ã³ã°ãšãã¢ã³ã¹ãã¬ãŒã·ã§ã³ïŒã·ã§ãŒããŒã³ãŒãããªã¢ã«ã¿ã€ã ã§å€æŽããã³æŽæ°ããŠWebGLã®æ©èœãæ«é²ã§ãããã©ã€ãã³ãŒãã£ã³ã°ã»ãã·ã§ã³ãšã€ã³ã¿ã©ã¯ãã£ããªãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã容æã«ããŸãã
- åçãªã³ã³ãã³ãæŽæ°ïŒããŒãžã®åèªã¿èŸŒã¿ãå¿ èŠãšããã«åçãªã³ã³ãã³ãæŽæ°ããµããŒãããããŒã¿ã¹ããªãŒã ãå€éšAPIãšã®ã·ãŒã ã¬ã¹ãªçµ±åãå¯èœã«ããŸãã
WebGLã·ã§ãŒããŒãããã¹ã¯ããã®å®è£ æ¹æ³
ã·ã§ãŒããŒãããã¹ã¯ããã®å®è£ ã«ã¯ãããã€ãã®ã¹ããããå«ãŸããŸãã
- ã·ã§ãŒããŒã³ã³ãã€ã«ïŒé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒããœãŒã¹ã³ãŒãããå®è¡å¯èœãªã·ã§ãŒããŒããã°ã©ã ã«ã³ã³ãã€ã«ããŸãã
- ããã°ã©ã ãªã³ã¯ïŒã³ã³ãã€ã«ãããé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒããªã³ã¯ããŠãå®å šãªã·ã§ãŒããŒããã°ã©ã ãäœæããŸãã
- Uniformããã³Attributeãã±ãŒã·ã§ã³ã®ååŸïŒã·ã§ãŒããŒããã°ã©ã å ã®uniformããã³attributeã®ãã±ãŒã·ã§ã³ãååŸããŸãã
- ã·ã§ãŒããŒããã°ã©ã ã®çœ®ãæãïŒçŸåšã¢ã¯ãã£ããªã·ã§ãŒããŒããã°ã©ã ãæ°ããã·ã§ãŒããŒããã°ã©ã ã«çœ®ãæããŸãã
- AttributeãšUniformã®åãã€ã³ãïŒæ°ããã·ã§ãŒããŒããã°ã©ã ã®ããã«é ç¹attributeãåãã€ã³ãããuniformå€ãèšå®ããŸãã
åã¹ãããã®è©³çްãã³ãŒãäŸãšãšãã«ä»¥äžã«ç€ºããŸãã
1. ã·ã§ãŒããŒã³ã³ãã€ã«
æåã®ã¹ãããã¯ãé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒãããããã®ãœãŒã¹ã³ãŒãããã³ã³ãã€ã«ããããšã§ããããã«ã¯ãã·ã§ãŒããŒãªããžã§ã¯ãã®äœæããœãŒã¹ã³ãŒãã®èªã¿èŸŒã¿ãããã³gl.compileShader()颿°ã䜿çšããã·ã§ãŒããŒã®ã³ã³ãã€ã«ãå«ãŸããŸããã³ã³ãã€ã«ãšã©ãŒãææããå ±åãããããã«ããšã©ãŒåŠçã¯éåžžã«éèŠã§ãã
function compileShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.error('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
return null;
}
return shader;
}
2. ããã°ã©ã ãªã³ã¯
é ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒãã³ã³ãã€ã«ããããããããããªã³ã¯ããŠå®å
šãªã·ã§ãŒããŒããã°ã©ã ãäœæããå¿
èŠããããŸããããã¯ãgl.createProgram()ãgl.attachShader()ãããã³gl.linkProgram()颿°ã䜿çšããŠè¡ãããŸãã
function createShaderProgram(gl, vsSource, fsSource) {
const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vsSource);
const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fsSource);
if (!vertexShader || !fragmentShader) {
return null;
}
const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
console.error('Unable to initialize the shader program: ' + gl.getProgramInfoLog(shaderProgram));
return null;
}
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
return shaderProgram;
}
3. Uniformããã³Attributeãã±ãŒã·ã§ã³ã®ååŸ
ã·ã§ãŒããŒããã°ã©ã ããªã³ã¯ããåŸãuniformããã³attribute倿°ã®ãã±ãŒã·ã§ã³ãååŸããå¿
èŠããããŸãããããã®ãã±ãŒã·ã§ã³ã¯ãã·ã§ãŒããŒããã°ã©ã ã«ããŒã¿ãæž¡ãããã«äœ¿çšãããŸããããã¯ãgl.getAttribLocation()ããã³gl.getUniformLocation()颿°ã䜿çšããŠå®çŸãããŸãã
function getAttributeLocations(gl, shaderProgram, attributes) {
const locations = {};
for (const attribute of attributes) {
locations[attribute] = gl.getAttribLocation(shaderProgram, attribute);
}
return locations;
}
function getUniformLocations(gl, shaderProgram, uniforms) {
const locations = {};
for (const uniform of uniforms) {
locations[uniform] = gl.getUniformLocation(shaderProgram, uniform);
}
return locations;
}
䜿çšäŸïŒ
const attributes = ['aVertexPosition', 'aVertexNormal', 'aTextureCoord'];
const uniforms = ['uModelViewMatrix', 'uProjectionMatrix', 'uNormalMatrix', 'uSampler'];
const attributeLocations = getAttributeLocations(gl, shaderProgram, attributes);
const uniformLocations = getUniformLocations(gl, shaderProgram, uniforms);
4. ã·ã§ãŒããŒããã°ã©ã ã®çœ®ãæã
ãããã·ã§ãŒããŒãããã¹ã¯ããã®æ žãšãªãéšåã§ããã·ã§ãŒããŒããã°ã©ã ã眮ãæããã«ã¯ããŸãäžèšã§èª¬æããããã«æ°ããã·ã§ãŒããŒããã°ã©ã ãäœæããæ¬¡ã«æ°ããããã°ã©ã ã䜿çšããããã«åãæ¿ããŸããå€ãããã°ã©ã ãäžèŠã«ãªã£ããšç¢ºä¿¡ãããåé€ããã®ãè¯ãç¿æ £ã§ãã
let currentShaderProgram = null;
function replaceShaderProgram(gl, vsSource, fsSource, attributes, uniforms) {
const newShaderProgram = createShaderProgram(gl, vsSource, fsSource);
if (!newShaderProgram) {
console.error('Failed to create new shader program.');
return;
}
const newAttributeLocations = getAttributeLocations(gl, newShaderProgram, attributes);
const newUniformLocations = getUniformLocations(gl, newShaderProgram, uniforms);
// Use the new shader program
gl.useProgram(newShaderProgram);
// Delete the old shader program (optional, but recommended)
if (currentShaderProgram) {
gl.deleteProgram(currentShaderProgram);
}
currentShaderProgram = newShaderProgram;
return {
program: newShaderProgram,
attributes: newAttributeLocations,
uniforms: newUniformLocations
};
}
5. AttributeãšUniformã®åãã€ã³ã
ã·ã§ãŒããŒããã°ã©ã ã眮ãæããåŸãæ°ããã·ã§ãŒããŒããã°ã©ã ã®ããã«é ç¹attributeãåãã€ã³ãããuniformå€ãèšå®ããå¿ èŠããããŸããããã«ã¯ãé ç¹attributeé åãæå¹ã«ããåattributeã®ããŒã¿åœ¢åŒãæå®ããããšãå«ãŸããŸãã
function bindAttributes(gl, attributeLocations, buffer, size, type, normalized, stride, offset) {
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
for (const attribute in attributeLocations) {
const location = attributeLocations[attribute];
gl.enableVertexAttribArray(location);
gl.vertexAttribPointer(
location,
size,
type,
normalized,
stride,
offset
);
}
}
function setUniforms(gl, uniformLocations, values) {
for (const uniform in uniformLocations) {
const location = uniformLocations[uniform];
const value = values[uniform];
if (location === null) continue; // Check for null uniform location.
if (uniform.startsWith('uModelViewMatrix') || uniform.startsWith('uProjectionMatrix') || uniform.startsWith('uNormalMatrix')){
gl.uniformMatrix4fv(location, false, value);
} else if (uniform.startsWith('uSampler')) {
gl.uniform1i(location, value);
} else if (uniform.startsWith('uLightPosition')) {
gl.uniform3fv(location, value);
} else if (typeof value === 'number') {
gl.uniform1f(location, value);
} else if (Array.isArray(value) && value.length === 3) {
gl.uniform3fv(location, value);
} else if (Array.isArray(value) && value.length === 4) {
gl.uniform4fv(location, value);
} // Add more cases as needed for different uniform types
}
䜿çšäŸïŒé ç¹ãããã¡ãšããã€ãã®uniformå€ãããå Žåãæ³å®ïŒïŒ
// After replacing the shader program...
const shaderData = replaceShaderProgram(gl, newVertexShaderSource, newFragmentShaderSource, attributes, uniforms);
// Bind the vertex attributes
bindAttributes(gl, shaderData.attributes, vertexBuffer, 3, gl.FLOAT, false, 0, 0);
// Set the uniform values
setUniforms(gl, shaderData.uniforms, {
uModelViewMatrix: modelViewMatrix,
uProjectionMatrix: projectionMatrix,
uNormalMatrix: normalMatrix,
uSampler: 0 // Texture unit 0
// ... other uniform values
});
äŸïŒè²å転ã®ããã®ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®ãããã¹ã¯ãã
ã·ã§ãŒããŒãããã¹ã¯ãããç°¡åãªäŸã§ç€ºããŸããããå®è¡æã«ãã©ã°ã¡ã³ãã·ã§ãŒããŒã眮ãæããããšã§ãã¬ã³ããªã³ã°ããããªããžã§ã¯ãã®è²ãå転ãããŸãã
åæãã©ã°ã¡ã³ãã·ã§ãŒã㌠(fsSource)ïŒ
precision mediump float;
varying vec4 vColor;
void main() {
gl_FragColor = vColor;
}
倿Žããããã©ã°ã¡ã³ãã·ã§ãŒã㌠(invertedFsSource)ïŒ
precision mediump float;
varying vec4 vColor;
void main() {
gl_FragColor = vec4(1.0 - vColor.r, 1.0 - vColor.g, 1.0 - vColor.b, vColor.a);
}
JavaScriptã«ãŠïŒ
let isInverted = false;
function toggleInversion() {
isInverted = !isInverted;
const fsSource = isInverted ? invertedFsSource : originalFsSource;
const shaderData = replaceShaderProgram(gl, vsSource, fsSource, attributes, uniforms); //Assuming vsSource and attributes/uniforms are already defined.
//Rebind attributes and uniforms, as described in previous sections.
}
//Call this function when you want to toggle color inversion (e.g., on a button click).
ã·ã§ãŒããŒãããã¹ã¯ããã®ãã¹ããã©ã¯ãã£ã¹
ã¹ã ãŒãºã§å¹ççãªã·ã§ãŒããŒãããã¹ã¯ããã確å®ã«ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããã
- ãšã©ãŒåŠçïŒã³ã³ãã€ã«ãšã©ãŒããªã³ã¯ãšã©ãŒãææããããã«ãå ç¢ãªãšã©ãŒåŠçãå®è£ ããŸããæå³ã®ãããšã©ãŒã¡ãã»ãŒãžã衚瀺ããåé¡ãè¿ éã«èšºæããã³è§£æ±ºããã®ã«åœ¹ç«ãŠãŸãã
- ãªãœãŒã¹ç®¡çïŒå€ãã·ã§ãŒããŒããã°ã©ã ã眮ãæããåŸãé©åã«åé€ããããšã§ã·ã§ãŒããŒããã°ã©ã ã®ãªãœãŒã¹ã管çããŸããããã«ãããã¡ã¢ãªãªãŒã¯ãé²ããå¹ççãªãªãœãŒã¹å©çšãä¿èšŒããŸãã
- éåæèªã¿èŸŒã¿ïŒã¡ã€ã³ã¹ã¬ããããããã¯ãããå¿çæ§ãç¶æããããã«ãã·ã§ãŒããŒãœãŒã¹ã³ãŒããéåæã§èªã¿èŸŒã¿ãŸãã
XMLHttpRequestãfetchãªã©ã®æè¡ã䜿çšããŠãããã¯ã°ã©ãŠã³ãã§ã·ã§ãŒããŒãèªã¿èŸŒã¿ãŸãã - ã³ãŒãã®æŽçïŒããè¯ãä¿å®æ§ãšåå©çšæ§ã®ããã«ãã·ã§ãŒããŒã³ãŒããã¢ãžã¥ãŒã«åŒã®é¢æ°ãšãã¡ã€ã«ã«æŽçããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®æé·ã«äŒŽãã·ã§ãŒããŒã®æŽæ°ãšç®¡çã容æã«ãªããŸãã
- Uniformã®äžè²«æ§ïŒæ°ããã·ã§ãŒããŒããã°ã©ã ãå€ãã·ã§ãŒããŒããã°ã©ã ãšåãuniform倿°ãæã€ããšã確èªããŸããããã§ãªãå Žåã¯ãããã«å¿ããŠuniformå€ãæŽæ°ããå¿ èŠããããããããŸããããããã¯ãã·ã§ãŒããŒã«ãªãã·ã§ã³ãŸãã¯ããã©ã«ãå€ãèšå®ããããã«ããŸãã
- Attributeã®äºææ§ïŒå±æ§ã®ååãããŒã¿åã倿Žãããå Žåãé ç¹ãããã¡ããŒã¿ã®éèŠãªæŽæ°ãå¿ èŠã«ãªãããšããããŸãããã®ã·ããªãªã«åããããã³ã¢ãšãªã屿§ã»ãããšäºææ§ãããããã«ã·ã§ãŒããŒãèšèšããŠãã ããã
æé©åæŠç¥
ã·ã§ãŒããŒãããã¹ã¯ããã¯ãæ³šææ·±ãå®è£ ããªããšããã©ãŒãã³ã¹ã®ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸããããã©ãŒãã³ã¹ãžã®åœ±é¿ãæå°éã«æããããã®æé©åæŠç¥ãããã€ã玹ä»ããŸãã
- ã·ã§ãŒããŒã³ã³ãã€ã«ã®æå°åïŒã³ã³ãã€ã«æžã¿ã®ã·ã§ãŒããŒããã°ã©ã ããã£ãã·ã¥ããå¯èœãªéãåå©çšããããšã§ãäžèŠãªã·ã§ãŒããŒã³ã³ãã€ã«ãé¿ããŸãããœãŒã¹ã³ãŒãã倿Žãããå Žåã«ã®ã¿ã·ã§ãŒããŒãã³ã³ãã€ã«ããŸãã
- ã·ã§ãŒããŒã®è€éãã®è»œæžïŒæªäœ¿çšã®å€æ°ãåé€ããæ°åŠçæŒç®ãæé©åããå¹ççãªã¢ã«ãŽãªãºã ã䜿çšããããšã§ãã·ã§ãŒããŒã³ãŒããç°¡çŽ åããŸããè€éãªã·ã§ãŒããŒã¯ãç¹ã«äœã¹ããã¯ããã€ã¹ã§ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãã
- Uniformã®äžæ¬æŽæ°ïŒWebGLåŒã³åºãã®æ°ãæå°éã«æããããã«ãuniformã®äžæ¬æŽæ°ãè¡ããŸããå¯èœãªéããåäžã®åŒã³åºãã§è€æ°ã®uniformå€ãæŽæ°ããŸãã
- ãã¯ã¹ãã£ã¢ãã©ã¹ã®äœ¿çšïŒè€æ°ã®ãã¯ã¹ãã£ãåäžã®ãã¯ã¹ãã£ã¢ãã©ã¹ã«çµåããŠããã¯ã¹ãã£ãã€ã³ãã£ã³ã°æäœã®æ°ãæžãããŸããããã«ãããç¹ã«ã·ã§ãŒããŒã§è€æ°ã®ãã¯ã¹ãã£ã䜿çšããå Žåã«ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
- ãããã¡ã€ã«ãšæé©åïŒWebGLãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«å¿ããŠã·ã§ãŒããŒã³ãŒããæé©åããŸããSpector.jsãChrome DevToolsãªã©ã®ããŒã«ã¯ãã·ã§ãŒããŒããã©ãŒãã³ã¹ãåæããæ¹åã®é åãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- ãããŠã³ã¹/ã¹ããããªã³ã°ïŒæŽæ°ãé »ç¹ã«ããªã¬ãŒãããå ŽåïŒäŸïŒãŠãŒã¶ãŒå ¥åã«åºã¥ãïŒãé床ãªåã³ã³ãã€ã«ãé²ãããã«ããããã¹ã¯ããæäœããããŠã³ã¹ãŸãã¯ã¹ããããªã³ã°ããããšãæ€èšããŠãã ããã
é«åºŠãªãã¯ããã¯
åºæ¬çãªå®è£ ãè¶ ããŠãã·ã§ãŒããŒãããã¹ã¯ããã匷åã§ããããã€ãã®é«åºŠãªãã¯ããã¯ããããŸãã
- ã©ã€ãã³ãŒãã£ã³ã°ç°å¢ïŒãªã¢ã«ã¿ã€ã ã®ã·ã§ãŒããŒç·šéãšå®éšãå¯èœã«ããããã«ãã·ã§ãŒããŒãããã¹ã¯ãããã©ã€ãã³ãŒãã£ã³ã°ç°å¢ã«çµ±åããŸããGLSL EditorãShadertoyãªã©ã®ããŒã«ã¯ãã·ã§ãŒããŒéçºã®ããã®ã€ã³ã¿ã©ã¯ãã£ããªç°å¢ãæäŸããŸãã
- ããŒãããŒã¹ã®ã·ã§ãŒããŒãšãã£ã¿ïŒããŒãããŒã¹ã®ã·ã§ãŒããŒãšãã£ã¿ã䜿çšããŠãã·ã§ãŒããŒã°ã©ããèŠèŠçã«èšèšããã³ç®¡çããŸãããããã®ãšãã£ã¿ã䜿çšãããšãã·ã§ãŒããŒæäœã衚ãç°ãªãããŒããæ¥ç¶ããŠãè€éãªã·ã§ãŒããŒå¹æãäœæã§ããŸãã
- ã·ã§ãŒããŒååŠçïŒã·ã§ãŒããŒååŠçæè¡ã䜿çšããŠããã¯ããå®çŸ©ãããã¡ã€ã«ãã€ã³ã¯ã«ãŒãããæ¡ä»¶ä»ãã³ã³ãã€ã«ãå®è¡ããŸããããã«ãããããæè»ã§åå©çšå¯èœãªã·ã§ãŒããŒã³ãŒããäœæã§ããŸãã
- ãªãã¬ã¯ã·ã§ã³ããŒã¹ã®UniformæŽæ°ïŒãªãã¬ã¯ã·ã§ã³æè¡ã䜿çšããŠã·ã§ãŒããŒããã°ã©ã ãæ€æ»ãããã®ååãšåã«åºã¥ããŠuniformå€ãèªåçã«èšå®ããããšã§ãuniformãåçã«æŽæ°ããŸããããã«ãããç¹ã«è€éãªã·ã§ãŒããŒããã°ã©ã ãæ±ãå Žåã«ãuniformæŽæ°ã®ããã»ã¹ãç°¡çŽ åã§ããŸãã
ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
ã·ã§ãŒããŒãããã¹ã¯ããã«ã¯å€ãã®å©ç¹ããããŸãããã»ãã¥ãªãã£äžã®åœ±é¿ãèæ ®ããããšãäžå¯æ¬ ã§ãããŠãŒã¶ãŒãä»»æã®ã·ã§ãŒããŒã³ãŒããæ³šå ¥ã§ããããã«ãããšãç¹ã«Webã¢ããªã±ãŒã·ã§ã³ã«ãããŠã»ãã¥ãªãã£ãªã¹ã¯ãåŒãèµ·ããå¯èœæ§ããããŸãã以äžã«ããã€ãã®ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé ã瀺ããŸãã
- å ¥åæ€èšŒïŒæªæã®ããã³ãŒãæ³šå ¥ãé²ãããã«ãã·ã§ãŒããŒãœãŒã¹ã³ãŒããæ€èšŒããŸãããŠãŒã¶ãŒå ¥åããµãã¿ã€ãºããã·ã§ãŒããŒã³ãŒããå®çŸ©ãããæ§æã«æºæ ããŠããããšã確èªããŸãã
- ã³ãŒã眲åïŒã·ã§ãŒããŒãœãŒã¹ã³ãŒãã®å®å šæ§ãæ€èšŒããããã«ã³ãŒã眲åãå®è£ ããŸããä¿¡é Œã§ãããœãŒã¹ããã®ã·ã§ãŒããŒã³ãŒãã®ã¿ãããŒãããã³å®è¡ãããããã«ããŸãã
- ãµã³ãããã¯ã¹åïŒã·ã¹ãã ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¶éããããã«ãã·ã§ãŒããŒã³ãŒãããµã³ãããã¯ã¹åãããç°å¢ã§å®è¡ããŸããããã«ãããæªæã®ããã³ãŒããã·ã¹ãã ã«å®³ãåãŒãã®ãé²ãããšãã§ããŸãã
- ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒ (CSP)ïŒã·ã§ãŒããŒã³ãŒããããŒãã§ãããœãŒã¹ãå¶éããããã«CSPããããŒãèšå®ããŸããããã¯ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã° (XSS) æ»æãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- 宿çãªã»ãã¥ãªãã£ç£æ»ïŒã·ã§ãŒããŒãããã¹ã¯ããå®è£ ã«ãããæœåšçãªè匱æ§ãç¹å®ãã察åŠããããã«å®æçãªã»ãã¥ãªãã£ç£æ»ã宿œããŸãã
çµè«
WebGLã·ã§ãŒããŒãããã¹ã¯ããã¯ãWebããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã«ãããŠãåçãªããžã¥ã¢ã«ãã€ã³ã¿ã©ã¯ãã£ããªãšãã§ã¯ããããã³ã·ãŒã ã¬ã¹ãªã³ã³ãã³ãæŽæ°ãå¯èœã«ãã匷åãªæè¡ã§ããå®è£ ã®è©³çްããã¹ããã©ã¯ãã£ã¹ãããã³æé©åæŠç¥ãçè§£ããããšã§ãéçºè ã¯ã·ã§ãŒããŒãããã¹ã¯ãããæŽ»çšããŠãããé åçã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœæã§ããŸããã»ãã¥ãªãã£ã«é¢ããèæ ®äºé ã¯éèŠã§ãããã·ã§ãŒããŒãããã¹ã¯ããã®å©ç¹ã¯ãææ°ã®WebGLéçºã«ãšã£ãŠäžå¯æ¬ ãªããŒã«ãšãªã£ãŠããŸããè¿ éãªãããã¿ã€ãã³ã°ããã©ã€ãã³ãŒãã£ã³ã°ããªã¢ã«ã¿ã€ã ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã«è³ããŸã§ãã·ã§ãŒããŒãããã¹ã¯ããã¯WebããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã«ãããåµé æ§ãšå¹çã®æ°ããªã¬ãã«ãè§£ãæŸã¡ãŸãã
WebGLãé²åãç¶ããã«ã€ããŠãã·ã§ãŒããŒãããã¹ã¯ããã¯ããã«æ®åããéçºè ãWebããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã®éçãæŒãåºãããŸããŸãæŽç·Žãããæ²¡å ¥åã®äœéšãäœæã§ããããã«ãªãã§ãããããã®å¯èœæ§ãæ¢æ±ããã·ã§ãŒããŒãããã¹ã¯ãããWebGLãããžã§ã¯ãã«çµ±åããŠãåçãªããžã¥ã¢ã«ãšã€ã³ã¿ã©ã¯ãã£ããªãšãã§ã¯ãã®å¯èœæ§ãæå€§éã«åŒãåºããŠãã ããã