【问题标题】:WebGL Clears Between Each setInterval [duplicate]WebGL在每个setInterval之间清除[重复]
【发布时间】:2016-01-16 19:51:00
【问题描述】:

gl.drawArrays 被顺序调用时,它会在画布上先前图形的顶部进行绘制。但是,当我将它放在 setInterval() 中时,它会在重绘之前清除画布。

绘制矩形的代码:

for(var i =0; i < 10; i++) {
    setRectangle(gl, Math.random()*100, Math.random()*100, 20, 20);
    gl.drawArrays(gl.TRIANGLES, 0, 6); 
}

每次绘制新矩形时擦除画布的代码:

interval = setInterval(() => {
    setRectangle(gl, Math.random()*100, Math.random()*100, 20, 20);
    gl.drawArrays(gl.TRIANGLES, 0, 6); 
}, 500);

这是包含上述代码的完整fiddle

我正在制作一款涉及实时处理大图像的游戏(如果有任何不同,请使用 phaser.js 库进行游戏循环)。我希望能够只重绘图像的所需部分,而不是在每个动画周期重绘整个图像。

为什么 webgl 画布会这样清晰?我可以阻止它清除吗?

【问题讨论】:

标签: html5-canvas webgl


【解决方案1】:

将第 51 行更改为 var gl = getWebGLContext(document.getElementById("canvas"), {preserveDrawingBuffer: true}); fiddle

警告:上次我检查为 firefox 启用此功能会导致它显着变慢。

【讨论】:

  • 啊哈!那很完美。哥们,谢谢! :) 后续问题:为什么gl.preserveDrawingBuffer = true; 不起作用?
  • 你说它不起作用是什么意思?如果您的意思是为什么在创建它之后不能将其设置在 gl 上下文中,那是因为它是 webgl 特定的东西,而 webgl api 旨在镜像 opengl es api。这也是规范所说的khronos.org/registry/webgl/specs/latest/1.0 搜索preserveDrawingBuffer
  • 是的,那是我的问题。感谢您的链接,这很有帮助。
  • 提出为什么缓冲区保留在 for 循环中而不是间隔中的问题...低级 #IDontKnowJavaScript 问题
  • the spec 的第 2.2 节涵盖了何时清除。 TL;DR 合成后清除
猜你喜欢
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多