Вы можете использовать gl.readPixels
:
// Render your scene first then...
var left = 0;
var top = 0;
var width = canvas.width;
var height = canvas.height;
var pixelData = new Uint8Array(width * height * 4);
gl.readPixels(left, top, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixelData);
pixelData теперь содержит пиксельные данные сцены в виде байтов без знака (0-255), расположенных как [R, G, B, A, R, G, B, A...]
Должны быть такими же данными, как getImageData
, нопо гораздо более низкой цене.
[ РЕДАКТИРОВАТЬ: ]
Я забыл упомянуть, что если вы собираетесь это делать, вы захотите создать свойКонтекст WebGL с параметром preserveDrawingBuffer
, например, так:
var gl = canvas.getContext("experimental-webgl", {preserveDrawingBuffer: true});
Это предотвращает внутреннюю работу WebGL от очистки буфера до того, как вы его доберетесь (что приведет к чтению целого ряда пустых пикселей).Включение этой опции может замедлить рендеринг, но он все равно должен загружаться быстрее, чем 5-8 FPS!:)