Opengl es 当alpha被遮罩时,为什么WebGL画布在第二帧变为白色?

Opengl es 当alpha被遮罩时,为什么WebGL画布在第二帧变为白色?,opengl-es,webgl,Opengl Es,Webgl,详情请参阅 综上所述,鉴于以下情况: 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

详情请参阅

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

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);
}
…那么我想知道理论上的预期产量应该是多少

实际上,我看到第一帧渲染时好像没有颜色遮罩,而第二帧(以及后续)渲染时整个画布都是不透明的白色

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

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


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

WebGL会自动清除每个帧上的图形缓冲区,除非您告诉它不要这样做

试一试


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

您尝试过glGetError吗?可以提供信息。请尝试将页面CSS背景设置为蓝色而不是白色,您的WebGL画布是否仍然显示白色,或者是否也变为蓝色?(换句话说,由于alpha值较低,白色区域是否只是一个透明的WebGL画布?)
gl = canvas.getContext('experimental-webgl', {
   preserveDrawingBuffer: true
});