Javascript requestAnimationFrame、readpixel和隐式clear

Javascript requestAnimationFrame、readpixel和隐式clear,javascript,webgl,Javascript,Webgl,我不明白为什么会丢失readpixel值​​在requestanimationframe循环中 var pixels = new Uint8Array(12*12*4); gl.clearColor(0.5, 0.8, 0.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT); gl.readPixels(0, 0, 12, 12, gl.RGBA, gl.UNSIGNED_BYTE, pixels); console.log(

我不明白为什么会丢失readpixel值​​在requestanimationframe循环中

var pixels = new Uint8Array(12*12*4); 

gl.clearColor(0.5, 0.8, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);
gl.readPixels(0, 0, 12, 12, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
console.log(pixels[0]);  //OK 128 !
anim();


function anim() {

  var pixels2 = new Uint8Array(12*12*4); 

  gl.readPixels(0, 0, 12, 12, gl.RGBA, gl.UNSIGNED_BYTE, pixels2);
  console.log(pixels2[0]); // STRANGE : 0 ????
  requestAnimationFrame(anim);
}
显然,如果我加上

gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);

在anim(){…}中,值为128。但是如果没有gl.clear,为什么会有黑色的clear?

因为默认情况下,WebGL会在每次合成操作后清除图形缓冲区。看

如果不希望WebGL清除图形缓冲区,则需要将
preserveDrawingBuffer:true
传递到
getContext

const gl=document.querySelector('canvas')
.getContext('webgl',{preserveDrawingBuffer:true});
var像素=新的UINT8阵列(12*12*4);
gl.clearColor(0.5,0.8,0.0,1.0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT |);
gl.readPixels(0,0,12,12,gl.RGBA,gl.UNSIGNED_字节,像素);
console.log(像素[0])//好的!
动漫();
函数anim(){
var pixels2=新的uint8阵列(12*12*4);
gl.readPixels(0,0,12,12,gl.RGBA,gl.UNSIGNED_字节,pixels2);
console.log(pixels2[0]);//奇怪:0????
请求动画帧(anim);
}

哦……好的!我正在搜索requestanimationframe规范。这是一种webgl行为。谢谢