如何使用WebGL上传大型图像到GPU而不会冻结浏览器(比如高分辨率的天空盒或贴图集)?
起初,我尝试寻找一种方法,让
然后,我尝试使用
以下是我所说的最小示例:http://jsfiddle.net/2v63f/3/。上传此图像到GPU需要约130毫秒。
完全相同的代码如下:
起初,我尝试寻找一种方法,让
texImage2D
异步执行其任务(将图像上传到GPU属于IO操作,对吧?),但是我没有找到任何方法。然后,我尝试使用
texSubImage2D
上传适合在16毫秒时间窗口中完成的小块(我目标是60 fps)。但是,只有当你传递ArrayBufferView
时,texSubImage2D
才会接受偏移量和宽度/高度参数——当传递图像对象时,你只能指定偏移量,并且它会(我猜测)上传整张图片。我想在将其绘制到画布上之前先在画布上绘制这个图像(以此获取它作为缓冲区),但这也和将整张图片上传到GPU一样慢。以下是我所说的最小示例:http://jsfiddle.net/2v63f/3/。上传此图像到GPU需要约130毫秒。
完全相同的代码如下:
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);
});