javascript - requestAnimationFrame 、 readpixel 和隐式清除

标签 javascript webgl

我不明白为什么我在 requestanimationframe 循环内丢失了 readpixel 值?

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 在每次复合操作后都会清除绘图缓冲区。请参阅https://stackoverflow.com/a/26790802/128511

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

const gl = document.querySelector('canvas')
  .getContext('webgl', {preserveDrawingBuffer: true});
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);
}
<canvas></canvas>

关于javascript - requestAnimationFrame 、 readpixel 和隐式清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54947518/

相关文章:

javascript - Canvas 正弦曲线非常模糊。我不知道为什么它模糊

javascript - 获取第二个 child 的内部文本值

javascript - 三人组 : assign different colors to each vertex in a geometry

javascript - 测量渲染时间

javascript - 使用 Chrome 存储中存储的键/值创建表

javascript - 使用javascript更改类的样式

javascript - 在 iframe 中显示下拉列表?

javascript - ThreeJS 中相机有奇怪的行为

javascript - 如何在 webGL 和 HTML5 中移动整个场景?

three.js - 使用 WebGL 和 Three.js 绘制圆形粗线