ããã§ããµã³ãã«ããã°ã©ã ã«å転ãã 3D ç«æ¹ä½ãã§ããã®ã§ãåè²ã§å¡ãã¤ã¶ããã¦ããç«æ¹ä½ã®è¡¨é¢ã«ãã¯ã¹ãã£ãå²ãå½ã¦ã¦ã¿ã¾ãããã
ãã¯ã¹ãã£ã®èªã¿è¾¼ã¿å§ãã«ããã¯ã¹ãã£ãèªã¿è¾¼ãã³ã¼ãã追å ãã¾ããä»åã¯åä¸ã®ãã¯ã¹ãã£ãç¨ãã¦ããã®ãã¯ã¹ãã£ãç«æ¹ä½ã®å ¨ 6 é¢ã«è²¼ãä»ãã¾ããããã¯ã¹ãã£ãããã¤ããå ´åã§ãåãæ¹æ³ãé©ç¨ã§ãã¾ãã
ã¡ã¢: ãã¯ã¹ãã£ã®èªã¿è¾¼ã¿ã¯ã¯ãã¹ãã¡ã¤ã³ã®ã«ã¼ã«ã«å¾ããã¨ã¸ã®æ³¨æãéè¦ã§ããããªãã¡ãã³ã³ãã³ãã CORS ã§èªå¯ããã¦ãããµã¤ãããã®ã¿ããã¯ã¹ãã£ãèªã¿è¾¼ããã¨ãã§ãã¾ãã詳ããã¯ä»¥ä¸ã®ãã¡ã¤ã³ãã¾ãããã¯ã¹ãã£ãåç §ãã¦ãã ããã
ã¡ã¢: ããã 2 ã¤ã®é¢æ°ã "webgl-demo.js" ã¹ã¯ãªããã«è¿½å ãã¾ãããã
//
// ãã¯ã¹ãã£ãåæåãã¦ç»åãèªã¿è¾¼ã¿ã¾ãã
// ç»åã®èªã¿è¾¼ã¿ãå®äºãããããã¯ã¹ãã£ã«ã³ãã¼ãã¾ãã
//
function loadTexture(gl, url) {
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
// ç»åã¯ã¤ã³ã¿ã¼ãããã§ãã¦ã³ãã¼ãããå¿
è¦ãããããã
// æºåãã§ããã¾ã§å°ãæéãããããã¨ãããã¾ãã
// ããã¾ã§ã¯ãã¯ã¹ãã£ã«ãã¯ã»ã«ã 1 ã¤ã ãå
¥ãã¦ãããã«
// 使ç¨ã§ããããã«ãã¦ããã¾ããç»åã®ãã¦ã³ãã¼ããå®äº
// ããããç»åã®ã³ã³ãã³ãã§ãã¯ã¹ãã£ãæ´æ°ãã¾ãã
const level = 0;
const internalFormat = gl.RGBA;
const width = 1;
const height = 1;
const border = 0;
const srcFormat = gl.RGBA;
const srcType = gl.UNSIGNED_BYTE;
const pixel = new Uint8Array([0, 0, 255, 255]); // ä¸éæã®é
gl.texImage2D(
gl.TEXTURE_2D,
level,
internalFormat,
width,
height,
border,
srcFormat,
srcType,
pixel,
);
const image = new Image();
image.onload = () => {
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(
gl.TEXTURE_2D,
level,
internalFormat,
srcFormat,
srcType,
image,
);
// WebGL1 ã¯ç»åã®å¤§ããã 2 ã®ã¹ãä¹ã§ãããã©ããã§
// è¦æ±ããããã®ãç°ãªãã®ã§ãç»åã®ä¸¡æ¹ã®è»¸ã 2 ã®
// ã¹ãä¹ãã©ããã調ã¹ã¾ãã
if (isPowerOf2(image.width) && isPowerOf2(image.height)) {
// 2 ã®ã¹ãä¹ãªã®ã§ã mips ã使ãã¾ãã
gl.generateMipmap(gl.TEXTURE_2D);
} else {
// 2 ã®ã¹ãä¹ã§ã¯ãªãã®ã§ã mips ããªãã«ãã¦ã
// ã¨ãã¸ã«ã¯ã©ã³ãããããã«ã©ããã³ã°ãè¨å®ãã¾ãã
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
}
};
image.src = url;
return texture;
}
function isPowerOf2(value) {
return (value & (value - 1)) === 0;
}
loadTexture()
ã«ã¼ãã³ã¯ WebGL ã® createTexture()
颿°ãå¼ã³åºã㦠WebGL ãã¯ã¹ãã£ãªãã¸ã§ã¯ã texture
ã使ãããã¨ããå§ãã¾ãããã®å¾ãtexImage2D()
ã使ç¨ãã¦åä¸ã®éããã¯ã»ã«ãã¢ãããã¼ããã¾ãããã¨ãç»åããã¦ã³ãã¼ãããã®ã«ããã¤ãæéãããã£ãã¨ãã¦ããããã«ãã£ã¦ãã¯ã¹ãã£ã¯éä¸è²ã¨ãã¦ããã«ä½¿ããããã«ãªãã¾ãã
ç»åãã¡ã¤ã«ãããã¯ã¹ãã£ãèªã¿è¾¼ãããã«ã Image
ãªãã¸ã§ã¯ãã使ãã src
ã«ãã¯ã¹ãã£ã¨ãã¦ä½¿ç¨ãããç»åã® URL ãå²ãå½ã¦ã¦ãã¾ãã image.onload
ã«å²ãå½ã¦ã颿°ã¯ç»åã®ãã¦ã³ãã¼ããå®äºããã¨å¼ã³åºããã¾ãããã®ç¹ã§ããã¯ã¹ãã£ã®ã½ã¼ã¹ãç»åã¨ãã¦ä½¿ç¨ãã¦ãä»åã® texImage2D()
ãåã³å¼ã³åºãã¾ãããã®å¾ããã¯ã¹ãã£ã®ãã£ã«ã¿ãªã³ã°ã¨ã©ããã³ã°ãããã¦ã³ãã¼ãããç»åã®å¤§ããããã©ã¡ãã®æ¬¡å
ã 2 ã®ã¹ãä¹ã§ãããã©ããã«åºã¥ãã¦è¨å®ãã¾ãã
WebGL1 ã§ã¯ã 2 ã®ã¹ãä¹ã§ãªã大ããã®ãã¯ã¹ãã£ã§ã¯ãã£ã«ã¿ãªã³ã°ã NEAREST
㨠LINEAR
ã«è¨å®ããããã使ç¨ãããã¨ãã§ããããããã®ããã«ãããããããçæãããã¨ã¯ã§ãã¾ãããã¾ããã©ããã³ã°ã¢ã¼ãã CLAMP_TO_EDGE
ã«è¨å®ããå¿
è¦ãããã¾ãã䏿¹ããã¯ã¹ãã£ã 2 次å
ã¨ã 2 ã®ã¹ãä¹ã®å¤§ããã®å ´åã WebGL ã¯ããé«å質ãªãã£ã«ã¿ãªã³ã°ãè¡ããã¨ãã§ããããããããã使ç¨ããã©ããã³ã°ã¢ã¼ãã REPEAT
ã¾ã㯠MIRRORED_REPEAT
ã«è¨å®ãããã¨ãã§ãã¾ãã
ç¹°ãè¿ããããã¯ã¹ãã£ã®ä¾ã¨ãã¦ã¯ãæ°åã®ã¬ã³ã¬ã®ç»åãã¿ã¤ã«ç¶ã«ä¸¦ã¹ãã¬ã³ã¬ã®å£ãè¦ããã®ãããã¾ãã
ããããããã³ã°ã UV ãªãã¼ãã¯ã texParameteri()
ã§ç¡å¹åã§ãã¾ããããã«ãããããããããã³ã°ã UV ã©ããã³ã°ã UV ã¿ã¤ãªã³ã°ãããã³æ©å¨ããã¯ã¹ãã£ãã©ã®ããã«æ±ããã®å¶å¾¡ãã§ããªããªã代ããã«ã NPOT ï¼2 ã®ã¹ãä¹ã§ã¯ãªãï¼ãã¯ã¹ãã£ãå©ç¨ã§ããããã«ãªãã¾ãã
// gl.LINEAR ã®ä»£ããã« gl.NEAREST ãå¯è½ãããããããã¯ä¸å¯
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
// S 座æ¨ã®ã©ããã³ã°ï¼ç¹°ãè¿ãï¼ãç¦æ¢
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
// T 座æ¨ã®ã©ããã³ã°ï¼ç¹°ãè¿ãï¼ãç¦æ¢
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
ç¹°ãè¿ãã¾ããããããã®å¼æ°ãä»å ããã¨ã WebGL ããã¤ã¹ã¯èªåçã«ï¼å¯¾å¿ããæå¤§ãµã¤ãºã¾ã§ã®ï¼ä»»æã®è§£å度ã®ãã¯ã¹ãã£ãåãå
¥ãã¾ããä¸è¨ã®æ§æãè¡ããªãã¨ã WebGL 㯠NPOT ãã¯ã¹ãã£ã®ãã¹ã¦ã®ãµã³ãã«ããéæãªé» (rgb(0 0 0 / 0%)
) ãè¿ãã¦å¤±æãããå¿
è¦ãããã¾ãã
ç»åãèªã¿è¾¼ãããã«ã main()
颿°å
ã« loadTexture()
颿°ã®å¼ã³åºãã追å ãã¾ãããã㯠initBuffers(gl)
å¼ã³åºãã®å¾ã«è¿½å ã§ãã¾ãã
ãããããã©ã¦ã¶ã¼ã¯èªã¿è¾¼ã¾ããã¤ã¡ã¼ã¸ã®ãã¯ã»ã«ãä¸ããä¸ãã¤ã¾ãå·¦ä¸ã®è§ããé ã«ã³ãã¼ããã®ã«å¯¾ãã WebGL ã¯ãã¯ã»ã«ãä¸ããä¸ãã¤ã¾ãå·¦ä¸ã®è§ããé ã«ã³ãã¼ããã¨ããç¹ã«æ³¨æãã¦ãã ãããï¼è©³ç´°ã«ã¤ãã¦ã¯ã Why is my WebGL texture upside-down? ãåç §ãã¦ãã ãããï¼
ãããã£ã¦ãã¬ã³ããªã³ã°æã«çµæã®ç»åãã¯ã¹ãã£ã®æ¹åãééã£ã¦è¡¨ç¤ºãããªãããã«ããã«ã¯ã gl.UNPACK_FLIP_Y_WEBGL
弿°ã true
ã«è¨å®ã㦠pixelStorei()
ãå¼ã³åºãå¿
è¦ãããã¾ããããã«ããããã¯ã»ã«ã WebGL ãæå¾
ããä¸ããä¸ã¸ã®é åºã«å転ããã¾ãã
ã¡ã¢: 以ä¸ã®ã³ã¼ãã main()
颿°ã® initBuffers()
ãå¼ã³åºããç´å¾ã«è¿½å ãã¦ãã ããã
// ãã¯ã¹ãã£ã®èªã¿è¾¼ã¿
const texture = loadTexture(gl, "cubetexture.png");
// ç»åãã¯ã»ã«ã WebGL ãæå¾
ããä¸ããä¸ã¸ã®é åºã«å転ããã
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
ã¡ã¢: æå¾ã«ãcubetexture.png ãã¡ã¤ã«ã JavaScript ãã¡ã¤ã«ã¨åããã¼ã«ã«ãã£ã¬ã¯ããªã¼ã«ãã¦ã³ãã¼ããã¾ãããã
ãã¯ã¹ãã£ã表é¢ã«ãããã³ã°ãã以ä¸ã§ããã¯ã¹ãã£ã®èªã¿è¾¼ã¿ã¨ä½¿ç¨ããæºåãã§ãã¾ãããããããã¯ã¹ãã£ã使ç¨ã§ããããã«ãªãã«ã¯ãã¾ãç«æ¹ä½ã®é¢ã®é ç¹ã«ãã¯ã¹ãã£ã®åº§æ¨ããããã³ã°ããå¿
è¦ãããã¾ããããã«ã¯ initBuffers()
ã«ãããç«æ¹ä½ã®åé¢ã«è²ãè¨å®ããæ¢åã®ã³ã¼ããç½®ãæãã¾ãã
ã¡ã¢: ãã®é¢æ°ã "init-buffer.js" ã¢ã¸ã¥ã¼ã«ã«è¿½å ãã¾ãããã
function initTextureBuffer(gl) {
const textureCoordBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, textureCoordBuffer);
const textureCoordinates = [
// åé¢
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// èé¢
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// ä¸é¢
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// ä¸é¢
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// å³é¢
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// å·¦é¢
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
];
gl.bufferData(
gl.ARRAY_BUFFER,
new Float32Array(textureCoordinates),
gl.STATIC_DRAW,
);
return textureCoordBuffer;
}
å§ãã«ããã®ã³ã¼ãã¯åé¢ã®ãã¯ã¹ãã£ã®åº§æ¨ãåãã GL ã®ãããã¡ã¼ã使ãã¦ããã®ãããã¡ã¼ãæ¸ãè¾¼ã¿ãè¡ãé åã¨ãã¦ãã¤ã³ããã¾ãã
textureCoordinates
é
åã¯ãåé¢ã®å座æ¨ã«å¯¾å¿ãããã¯ã¹ãã£ã®åº§æ¨ãå®ç¾©ãã¾ãããã¯ã¹ãã£ã®åº§æ¨ã®ç¯å²ã¯ 0.0 ãã 1.0 ã§ãããã¨ã«æ³¨æãã¦ãã ããããã¯ã¹ãã£ãããã³ã°ã®ããã«ããã¯ã¹ãã£ã®å¯¸æ³ã¯å®éã®å¤§ããã«é¢ããã 0.0 ãã 1.0 ã®ç¯å²ã«æ£è¦åããã¾ãã
ãã¯ã¹ãã£ãããã³ã°ã®é åãè¨å®ããããé åããããã¡ã¼ã«æ¸¡ããã¨ã§ GL ããã®ãã¼ã¿ã使ç¨ããæºåãå®äºãã¾ãã
ããã¦ãã®æ°ãããããã¡ã¼ãè¿ãã¾ãã
次ã«ãè²ãããã¡ã¼ã®ä»£ããã«ãã¯ã¹ãã£ã¼åº§æ¨ãããã¡ã¼ã使ãã¦è¿ãããã« initBuffers()
ãæ´æ°ããå¿
è¦ãããã¾ãã
ã¡ã¢: "init-buffers.js" ã¢ã¸ã¥ã¼ã«ã® initBuffers()
颿°ã§ã initColorBuffer()
ã®å¼ã³åºãã以ä¸ã®è¡ã«ç½®ãæãã¾ãããã
const textureCoordBuffer = initTextureBuffer(gl);
ã¡ã¢: "init-buffers.js" ã¢ã¸ã¥ã¼ã«ã® initBuffers()
颿°ã§ã return
æã以ä¸ã«ç½®ãæãã¾ãããã
return {
position: positionBuffer,
textureCoord: textureCoordBuffer,
indices: indexBuffer,
};
ã·ã§ã¼ãã¼ã®æ´æ°
ã·ã§ã¼ãã¼ããã°ã©ã ããåè²ã®ä»£ããã«ãã¯ã¹ãã£ã使ç¨ããããã«æ´æ°ããå¿ è¦ãããã¾ãã
é ç¹ã·ã§ã¼ãã¼é ç¹ã·ã§ã¼ãã¼ããè²ãã¼ã¿ãåå¾ãã代ããã«ããã¯ã¹ãã£åº§æ¨ãã¼ã¿ãåå¾ããããã«ç½®ãæããå¿ è¦ãããã¾ãã
ã¡ã¢: 以ä¸ã®ããã« main()
颿°ã® vsSource
宣è¨ãæ´æ°ãã¾ãããã
const vsSource = `
attribute vec4 aVertexPosition;
attribute vec2 aTextureCoord;
uniform mat4 uModelViewMatrix;
uniform mat4 uProjectionMatrix;
varying highp vec2 vTextureCoord;
void main(void) {
gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition;
vTextureCoord = aTextureCoord;
}
`;
ããã§ã®éè¦ãªå¤æ´ã¯ãé ç¹ã®è²ãåå¾ãã代ããã«ããã¯ã¹ãã£åº§æ¨ãåå¾ãã¦ãã©ã°ã¡ã³ãã·ã§ã¼ãã¼ã«æ¸¡ãã¦ãããã¨ã§ããããã«ãããé ç¹ã«å¯¾å¿ãããã¯ã¹ãã£å ã®ä½ç½®ã示ãã¾ãã
ãã©ã°ã¡ã³ãã·ã§ã¼ãã¼ãã©ã°ã¡ã³ãã·ã§ã¼ãã¼ãåæ§ã«æ´æ°ããå¿ è¦ãããã¾ãã
ã¡ã¢: 以ä¸ã®ããã« main()
颿°ã® fsSource
宣è¨ãæ´æ°ãã¾ãããã
const fsSource = `
varying highp vec2 vTextureCoord;
uniform sampler2D uSampler;
void main(void) {
gl_FragColor = texture2D(uSampler, vTextureCoord);
}
`;
ãã©ã°ã¡ã³ãã®è²ã«è²ã®å¤ãå²ãå½ã¦ã代ããã«ããã©ã°ã¡ã³ãã®è²ã Texel ï¼ã¤ã¾ãããã¯ã¹ãã£å
ã®ãã¯ã»ã«ï¼ãåå¾ãããã¨ã§ãè²ã¨åæ§ã«é ç¹éã§è£éããã vTextureCoord
ã®å¤ã«åºã¥ãã¦è¨ç®ããããã«ãã¾ãã
屿§ã夿´ããã¦ããã©ã¼ã ã追å ããã®ã§ããããã®ä½ç½®ã調ã¹ã¦ããå¿ è¦ãããã¾ãã
ã¡ã¢: main()
颿°ã® programInfo
宣è¨ã次ã®ããã«æ´æ°ãã¾ãããã
const programInfo = {
program: shaderProgram,
attribLocations: {
vertexPosition: gl.getAttribLocation(shaderProgram, "aVertexPosition"),
textureCoord: gl.getAttribLocation(shaderProgram, "aTextureCoord"),
},
uniformLocations: {
projectionMatrix: gl.getUniformLocation(shaderProgram, "uProjectionMatrix"),
modelViewMatrix: gl.getUniformLocation(shaderProgram, "uModelViewMatrix"),
uSampler: gl.getUniformLocation(shaderProgram, "uSampler"),
},
};
ãã¯ã¹ãã£ãè²¼ãä»ããç«æ¹ä½ã®æç»
drawScene()
颿°ã®å¤æ´ç¹ã¯ç°¡åã§ãã
ã¡ã¢: "draw-scene.js" ã¢ã¸ã¥ã¼ã«ã® drawScene()
颿°å
ã«ã以ä¸ã®é¢æ°ã追å ãã¾ãããã
// ãã¯ã¹ãã£åº§æ¨ããããã¡ã¼ããåãåºãæ¹æ³ã webgl ã«ä¼ããã
function setTextureAttribute(gl, buffers, programInfo) {
const num = 2; // ãã¹ã¦ã®åº§æ¨ã¯ 2 ã¤ã®å¤ãããªã
const type = gl.FLOAT; // ãããã¡ã¼å
ã®ãã¼ã¿ã¯ 32 ãããæµ®åå°æ°ç¹æ°
const normalize = false; // æ£è¦åãªã
const stride = 0; // ããã»ããããæ¬¡ã®ã»ããã¾ã§ãä½ãã¤ãã§ç§»åããã
const offset = 0; // ãããã¡å
ã®ä½ãã¤ãããéå§ããã
gl.bindBuffer(gl.ARRAY_BUFFER, buffers.textureCoord);
gl.vertexAttribPointer(
programInfo.attribLocations.textureCoord,
num,
type,
normalize,
stride,
offset,
);
gl.enableVertexAttribArray(programInfo.attribLocations.textureCoord);
}
ã¡ã¢: "draw-scene.js" ã¢ã¸ã¥ã¼ã«ã® drawScene()
颿°å
ã§ã setColorAttribute()
ã®å¼ã³åºãã以ä¸ã®è¡ã«ç½®ãæãã¾ãããã
setTextureAttribute(gl, buffers, programInfo);
次ã«ãé¢ã«ãããã³ã°ãããã¯ã¹ãã£ãæå®ããã³ã¼ãã追å ãã¾ãã
ã¡ã¢: drawScene()
颿°ã®ä¸ã§ã gl.uniformMatrix4fv()
ã 2 åå¼ã³åºããç´å¾ã«ã以ä¸ã®ã³ã¼ãã追å ãã¾ãããã
// ãã¯ã¹ãã£ã¦ããã 0 ã«å½±é¿ãä¸ããããã¨ã WebGL ã«ä¼ãã
gl.activeTexture(gl.TEXTURE0);
// ãã¯ã¹ãã£ããã¯ã¹ãã£ã¦ããã 0 ã«ãã¤ã³ããã
gl.bindTexture(gl.TEXTURE_2D, texture);
// ãã¯ã¹ãã£ããã¯ã¹ãã£ã¦ããã 0 ã«ãã¤ã³ããããã¨ãã·ã§ã¼ãã¼ã«ä¼ãã
gl.uniform1i(programInfo.uniformLocations.uSampler, 0);
WebGL ã¯æä½ 8 ã¤ã®ãã¯ã¹ãã£ã¦ããããæä¾ãã¾ãããã®ãã¡ã®æåã®ã¦ãããã gl.TEXTURE0
ã§ããã¦ããã 0 ã«é©ç¨ããããã¨ã WebGL ã«ä¼ãã¾ããããã¦ã bindTexture()
ãå¼ã³åºãããã¯ã¹ãã£ããã¯ã¹ãã£ã¦ããã 0 ã® TEXTURE_2D
ãã¤ã³ããã¤ã³ãã«ãã¤ã³ããã¾ãã uSampler
ã«ã¯ãã¯ã¹ãã£ã¦ããã 0 ã使ç¨ããããã«ã·ã§ã¼ãã¼ã«ä¼ãã¾ãã
æå¾ã«ãdrawScene()
颿°ã®å¼æ°ã¨ã㦠texture
ã追å ãã¾ãã
drawScene()
颿°ã®å®£è¨ãæ´æ°ããæ°ãã弿°ã追å ãã¾ãããã
function drawScene(gl, programInfo, buffers, texture, cubeRotation) {
// â¦
}
main()
颿°ã® drawScene()
ãå¼ã³åºãå ´æãæ´æ°ãã¾ãããã
drawScene(gl, programInfo, buffers, texture, cubeRotation);
ããã§ãå転ããç«æ¹ä½ã¯åé¡ãªãåä½ãã¾ãã
ã³ã¼ãã確èªãã | æ°ãããã¼ã¸ã§ãã¢ãéã
ãã¡ã¤ã³ãã¾ãããã¯ã¹ãã£WebGL ã®ãã¯ã¹ãã£ã®èªã¿è¾¼ã¿ã¯ããã¡ã¤ã³éã¢ã¯ã»ã¹å¶å¾¡ã«å¾ãã¾ããã³ã³ãã³ãã§ä»ã®ãã¡ã¤ã³ãããã¯ã¹ãã£ãèªã¿è¾¼ãããã«ã¯ã CORS ã§è¨±å¯ãå¾ãªããã°ãªãã¾ããã CORS ã«ã¤ãã¦è©³ããã¯ã HTTP ã¢ã¯ã»ã¹å¶å¾¡ ãã覧ãã ããã
WebGL ã¯ä¿è·ãããã³ã³ããã¹ããããã¯ã¹ãã£ãèªã¿è¾¼ãå¿
è¦ãããããã WebGL ã§ file:///
ã® URL ããèªã¿è¾¼ãã ãã¯ã¹ãã£ã使ç¨ãããã¨ã¯ã§ãã¾ãããã¤ã¾ããã³ã¼ãã®ãã¹ãã¨å±éã«ã¯ãå®å
¨ãªã¦ã§ããµã¼ãã¼ãå¿
è¦ã ã¨ãããã¨ã§ãããã¼ã«ã«ã§ãã¹ãããå ´åã¯ãã¼ã«ã«ãã¹ããµã¼ãã¼ãç¨æããã«ã¯ãåç
§ãã¦ãã ããã
CORS ã§è¨±å¯ãããç»åã WebGL ã®ãã¯ã¹ãã£ã¨ãã¦ä½¿ç¨ããæ¹æ³ã®èª¬æãããã¡ãã® hacks.mozilla.org ã®è¨äºã«æ²è¼ãã¦ãã¾ãã
æ±æãããï¼æ¸ãè¾¼ã¿å°ç¨ã®ï¼ 2D ãã£ã³ãã¹ã WebGL ã®ãã¯ã¹ãã£ã¨ãã¦ä½¿ç¨ãããã¨ã¯ã§ãã¾ããã 2D ã® <canvas>
ãæ±æãããã¨ã¯ãä¾ãã°ãå¥ãã¡ã¤ã³ã®ç»åã canvas ä¸ã«æç»ãããç¶æ
ãæãã¾ãã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4