3

有关详细信息,请参阅此线程

综上所述,鉴于以下情况:

gl = canvas.getContext('experimental-webgl');
gl.clearColor(0, 0, 0, 1);
gl.colorMask(1, 1, 1, 0);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
gl.enable(gl.BLEND);

...和一个标准的渲染循环:

function doRender() {
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  // render stuff, and request another frame
  requestAnimationFrame(doRender);
}

...那么我想知道理论上的预期输出应该是什么。

实际上,我看到第一帧呈现好像没有颜色掩码,而第二个(和后续)帧呈现整个画布 opaque white

请注意,alpha 级别设置为什么并不重要:即使渲染的 alpha 值非常低,第二帧也始终是立即的、完全白色的(包括未渲染到的区域)。

问题:上述操作对第一帧、第二帧和后续帧的预期结果是什么?另外,我遇​​到的是预期的结果,还是由于 GL 驱动程序或 WebGL 实现中的一些错误?最后,如果这是预期的结果,为什么?视频卡上实际发生了什么来产生这个结果?

系统详细信息:MacBook Pro / GeForce 320M / Snow Leopard 上的 Chrome / Firefox(两者)。

4

1 回答 1

5

WebGL 会自动清除每一帧的绘图缓冲区,除非你告诉它不要这样做

尝试

gl = canvas.getContext('experimental-webgl', {
   preserveDrawingBuffer: true
});

这可能比让它清除要慢,因为它可能必须在每帧制作绘图缓冲区的副本以保存它,因此当您在其中绘制新内容时,它有一个副本可以与页面的其余部分合成。因此,在渲染循环中调用 gl.clear 可能会更好。当然,如果您想要的效果是不断地将东西混合到绘图缓冲区中,那么您需要告诉它像上面的示例一样保留,或者您需要使用帧缓冲区绘制到纹理或渲染缓冲区中,然后将其渲染到绘图缓冲区。

于 2012-07-19T03:17:29.277 回答