Why WebGL 'clear' draw to front buffer?
为什么不需要交换缓冲区或glFinish?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <!DOCTYPE html> <html> <head> Game v.0.0 var gl = null; function startGame() { { var canvas = document.getElementById('gameCanvas'); var glNames = ["webgl","experimental-webgl","webkit-3d","moz-webgl"]; for (var glNameI = 0; glNameI < glNames.length; ++glNameI) try { gl = canvas.getContext(glNames[glNameI]); if (gl) break; } catch(e) {} if(!gl) { canvas.outerHTML ="WebGL NOT SUPPORTED? :("; return; } } window.onkeydown = function(ev) { switch(ev.keyCode) { case 49:// 1 key gl.clearColor(0.3,0.7,0.2,1.0); gl.clear(gl.COLOR_BUFFER_BIT); break; case 50:// 2 key gl.clearColor(0.3,0.2,0.7,1.0); gl.clear(gl.COLOR_BUFFER_BIT); break; } }; } <style type="text/css"> canvas {border: 2px dotted blue;} </style> </head> <body onloadx="startGame()"> <canvas id="gameCanvas" width="640" height="480"></canvas> </body> </html> |
因为这就是WebGL的工作方式。
WebGL自动交换/复制。每当您执行任何会影响WebGL drawingBuffer(例如" backbuffer")的操作时,都会将其标记为交换/复制。下一次浏览器合成网页时,它将执行交换或复制操作。您可以告诉它始终复制。无法告诉它总是交换
具体来说,使用
中的内容来创建WebGL上下文
1 | gl = someCanvas.getContext("webgl", {preserveDrawingBuffer: true}); |
告诉WebGL您始终希望它进行复制。
默认值为WebGL根据各种因素选择交换或复制。例如,如果启用了抗锯齿功能,则它始终始终是一个副本(解决方案),而仿效处理功能已关闭,则它可能是一个交换。同样,在这种默认情况下,当
如果
如果要在多个JavaScript事件上进行大量工作,并且在完成所有工作之前不让用户看到结果,则需要渲染到具有附加纹理或渲染缓冲区的帧缓冲区,然后在所有完成工作比渲染到画布(后缓冲区)要好。
至于