【发布时间】:2014-09-26 04:46:43
【问题描述】:
如何使用 webgl 将大图像上传到 GPU 而不会冻结浏览器(想想高分辨率天空盒或纹理图集)?
起初我想寻找是否有办法让texImage2D 异步执行其操作(将图像上传到 GPU 是 IO-ish,对吗?),但我找不到任何方法。
然后我尝试使用texSubImage2D 上传适合 16 毫秒时间窗口的小块(我的目标是 60 fps)。但是texSubImage2D 仅在您传入ArrayBufferView 时才采用偏移量和宽度/高度参数 - 传入图像对象时,您只能指定偏移量,它会(我猜)上传整个图像。我想首先将图像绘制到画布(将其作为缓冲区)与将整个图像上传到 GPU 一样慢。
这是我的意思的一个最小示例:http://jsfiddle.net/2v63f/3/。 我需要大约 130 毫秒来将此图像上传到 GPU。
与 jsfiddle 上的代码完全相同:
var canvas = document.getElementById('can');
var gl = canvas.getContext('webgl');
var image = new Image();
image.crossOrigin = "anonymous";
//image.src = 'http://i.imgur.com/9Tq28Qj.jpg?1';
image.src = 'http://i.imgur.com/G0qL97y.jpg'
image.addEventListener('load', function () {
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
var now = performance.now();
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
console.log(performance.now() - now);
});
【问题讨论】:
标签: javascript webgl