ä»åã®ãã¢ã³ã¹ãã¬ã¼ã·ã§ã³ã§ã¯ãååã®ä¾ã§ç¨ããéçãªãã¯ã¹ãã£ã Ogg ãããªãã¡ã¤ã«ã®ãã¬ã¼ã ã«ç½®ãæãã¾ããå®ã¯ãããè¡ãã®ã¯ã¨ã¦ãç°¡åã§ãããè¦ã¦ãã¦æ¥½ããã§ãããã£ããå§ãã¾ãããããªãåæ§ã®ã³ã¼ãããã©ããªç¨®é¡ã®ãã¼ã¿ï¼<canvas>
ãªã©ï¼ããã¯ã¹ãã£ã®ã½ã¼ã¹ã¨ãã¦ç¨ããå ´åã§ã使ç¨ãããã¨ãã§ãã¾ãã
å§ãã«ããããªãã¬ã¼ã ãåãåºãã®ã«ä½¿ã <video>
è¦ç´ ã使ãã¾ãã
ã¡ã¢: ãã®å®£è¨ã "webgl-demo.js" ã¹ã¯ãªããã®å§ãã«è¿½å ãã¾ãããã
// åç»ããã¯ã¹ãã£ã«ã³ãã¼ã§ããå ´å㯠true ã«è¨å®ãã
let copyVideo = false;
ã¡ã¢: ãã®é¢æ°ã "webgl-demo.js" ã¹ã¯ãªããã«è¿½å ãã¾ãããã
function setupVideo(url) {
const video = document.createElement("video");
let playing = false;
let timeupdate = false;
video.playsInline = true;
video.muted = true;
video.loop = true;
// åç»ã®ãã¼ã¿ã確å®ã«ãããã¨ãä¿è¨¼ããããã«ã
// ãã® 2 ã¤ã®ã¤ãã³ããå¾
ã¤
video.addEventListener(
"playing",
() => {
playing = true;
checkReady();
},
true,
);
video.addEventListener(
"timeupdate",
() => {
timeupdate = true;
checkReady();
},
true,
);
video.src = url;
video.play();
function checkReady() {
if (playing && timeupdate) {
copyVideo = true;
}
}
return video;
}
æåã«åç»è¦ç´ ã使ãã¾ããåç»ãèªååçããé³ããã¥ã¼ãããã«ã¼ãåçããããã«è¨å®ãã¾ããæ¬¡ã«ãåç»ãåçãããæå»ãæ´æ°ããããã¨ã確èªããããã« 2 ã¤ã®ã¤ãã³ããè¨å®ãã¾ããã¾ã å©ç¨ã§ãããã¼ã¿ããªãåç»ã WebGL ã«ã¢ãããã¼ãããã¨ã¨ã©ã¼ã«ãªãããããã®ä¸¡æ¹ã®ãã§ãã¯ãå¿
è¦ã§ãããããã®ã¤ãã³ããã©ã¡ãã調ã¹ããã¨ã§ãå©ç¨ã§ãããã¼ã¿ããããã¨ã確èªãããWebGL ãã¯ã¹ãã£ã¸ã®åç»ã®ã¢ãããã¼ããå§ããã®ã«ã¯å®å
¨ã§ãããã¨ãä¿è¨¼ããã¾ããä¸è¨ã®ã³ã¼ãã§ã¯ããããã®ã¤ãã³ããã©ã¡ããåå¾ãããã¨ã確èªãã¦ãã¾ããåå¾ããå ´åã¯ãã°ãã¼ãã«å¤æ° copyVideo
ã« true ãè¨å®ããåç»ããã¯ã¹ãã£ã«ã³ãã¼ãå§ãã¦ãå®å
¨ã§ãããã¨ã示ãã¦ãã¾ãã
ããã¦æå¾ã«ã src
屿§ãè¨å®ãã play
ãå¼ã³åºãã¦åç»ã®èªã¿è¾¼ã¿ã¨åçãéå§ãã¾ãã
WebGL ã«ãã¯ã¹ãã£ãã¼ã¿ãæä¾ããããã«ä½¿ç¨ããããã«ã¯ãå ã®åç»ãå®å ¨ãªã½ã¼ã¹ããèªã¿è¾¼ãå¿ è¦ãããã¾ããã¤ã¾ããå®å ¨ãªã¦ã§ããµã¼ãã¼ã使ç¨ããããã«ã³ã¼ããå±éããå¿ è¦ãããã ãã§ãªãããã¹ãããããã®å®å ¨ãªãµã¼ãã¼ãå¿ è¦ã«ãªãã¾ãããã¼ã«ã«ãã¹ããµã¼ãã¼ãç¨æããã«ã¯ãåç §ãã¦ãã ããã
åç»ãã¬ã¼ã ããã¯ã¹ãã£ã¨ãã¦ä½¿ç¨ããæ¬¡ã«å¤æ´ããã®ã¯ initTexture()
ã§ããç»åãã¡ã¤ã«ãèªã¿è¾¼ãå¿
è¦ããªããªã£ããããã¨ã¦ãåç´ã«ãªãã¾ããç»åãèªã¿è¾¼ã代ããã«ã空ã®ãã¯ã¹ãã£ãªãã¸ã§ã¯ãã使ãã¦ãå¾ã§ä½¿ç¨ãããã£ã«ã¿ã¼ãè¨å®ãã¾ãã
ã¡ã¢: "webgl-demo.js" ã® loadTexture()
颿°ã以ä¸ã®ã³ã¼ãã«ç½®ãæãã¾ãããã
function initTexture(gl) {
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
// åç»ã¯ã¤ã³ã¿ã¼ãããçµç±ã§ãã¦ã³ãã¼ãããªããã°ãªããªã
// ãããæºåãã§ããã¾ã§æéããããå¯è½æ§ãããã¾ãã
// ãã®ããããã¯ã¹ãã£ã«åä¸ã®ãã¯ã»ã«ãç½®ããã¨ã§ã
// ç´ã¡ã«ãããå©ç¨ãããã¨ãã§ãã¾ãã
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,
);
// mips ããªãã«ãã wrapping ã clamp to edge ã«è¨å®ãããã¨ã§ãåç»ã®å¤§ããã«é¢ä¿ãªãåä½ããããã«ãªãã¾ãã
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);
return texture;
}
ã¡ã¢: 以ä¸ã®é¢æ°ã "webgl-demo.js" ã«è¿½å ãã¾ãããã
function updateTexture(gl, texture, video) {
const level = 0;
const internalFormat = gl.RGBA;
const srcFormat = gl.RGBA;
const srcType = gl.UNSIGNED_BYTE;
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(
gl.TEXTURE_2D,
level,
internalFormat,
srcFormat,
srcType,
video,
);
}
ãã®ã³ã¼ãã¯ä»¥åã«ãè¦ããã¨ãããã§ããããååã®ä¾ã®ç»å onload 颿°ã¨ã»ã¼åãã§ããã texImage2D()
ãå¼ã³åºãã¨ãã« Image
ãªãã¸ã§ã¯ããæ¸¡ã代ããã« <video>
è¦ç´ ãæ¸¡ãã¦ããç¹ãç°ãªãã¾ãã WebGL ã¯ç¾å¨ã®ãã¬ã¼ã ãåãåºãããã¯ã¹ãã£ã¨ãã¦ä½¿ç¨ããæ¹æ³ãç¥ã£ã¦ãã¾ãã
次ã«ããããã®æ°ãã颿°ã main()
颿°ããå¼ã³åºãå¿
è¦ãããã¾ãã
ã¡ã¢: main()
颿°ã§ã loadTexture()
ã®å¼ã³åºããæ¬¡ã®ã³ã¼ãã«ç½®ãæãã¾ãããã
const texture = initTexture(gl);
const video = setupVideo("Firefox.mp4");
ã¡ã¢: ã¾ããFirefox.mp4 ãã¡ã¤ã«ã JavaScript ãã¡ã¤ã«ã¨åããã¼ã«ã«ãã£ã¬ã¯ããªã¼ã«ãã¦ã³ãã¼ãããå¿ è¦ãããã¾ãã
ã¡ã¢: main()
颿°ã§ã render()
颿°ããã®ããã«ç½®ãæãã¾ãããã
// ã·ã¼ã³ãå復ãã¦æç»
function render(now) {
now *= 0.001; // ç§ã¸å¤æ
deltaTime = now - then;
then = now;
if (copyVideo) {
updateTexture(gl, texture, video);
}
drawScene(gl, programInfo, buffers, texture, cubeRotation);
cubeRotation += deltaTime;
requestAnimationFrame(render);
}
copyVideo
ã true ã®å ´åã drawScene()
颿°ãå¼ã³åºãç´åã« updateTexture()
ãå¼ã³åºãã¾ãã
以ä¸ã§ãã
ã³ã¼ãã確èªãã | æ°ãããã¼ã¸ã§ãã¢ãéã
é¢é£æ å ±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