为什么WebGL“清除”绘制到前缓冲区堆栈溢出 最近30次来自stackoverflow.com 2024-06-28T19:25:35Z https://stackoverflow.com/feeds/question/33327585 https://creativecommons.org/licenses/by-sa/4.0/rdf https://stackoverflow.com/q/33327585 1 为什么WebGL“清除”前端缓冲区的绘制? biv公司 https://stackoverflow.com/users/4336535 2015年10月25日08:17:49分 2015年10月25日15:43:46Z <p>为什么不需要swap-buffers或glFinish</p><pre><code>&lt;!DOCTYPE html&gt;&它;html&gt;&它;头部&gt;&它;标题&gt;游戏v.0.0&lt/标题&gt;&它;脚本&gt;var gl=空;函数startGame(){{var canvas=document.getElementById('gameCanvas');var glNames=[“webgl”,“experimental-webgl“,”webkit-3d“,”moz-webgl;对于(var glNameI=0;glNameI&lt;glNames.length;++glNameI)尝试{gl=画布.getContext(glNames[glNameI]);如果(gl)断裂;}捕获(e){}如果(!gl){canvas.outerHTML=“不支持WebGL?:(&lt;/a&gt;”;回报;}}window.onkeydown=函数(ev){开关(ev.keyCode){案例49://1键gl.清晰颜色(0.3,0.7,0.2,1.0);全局清除(全局COLOR_BUFFER_BIT);断裂;案例50://2键gl.清晰颜色(0.3,0.2,0.7,1.0);全局清除(全局COLOR_BUFFER_BIT);断裂;}};}&它/脚本&gt;&它;style type=“text/css”&gt;画布{边框:2px点蓝色;}&它/风格&gt;&它/头部&gt;&它;body onload=“startGame()”&gt;&它;div&gt&书信电报;canvas id=“gameCanvas”width=“640”height=“480”&gt&它/画布&gt&它/div&gt;&它/车身&gt;&它/html&gt;</code></pre> https://stackoverflow.com/questions/33327585/-/33331594#33331594 7 由gman回答为什么WebGL“清除”前缓冲区绘制? gman公司 https://stackoverflow.com/users/128511 2015年10月25日15:43:46Z 2015年10月25日15:43:46Z <p>因为这就是WebGL的工作方式</p><p>WebGL自动交换/复制。每当你做任何影响WebGL drawingBuffer(想想“backbuffer”)的事情时,它都会被标记为交换/复制。下次浏览器合成网页时,它会进行交换或复制。你可以告诉它总是复制。你不能告诉它总是交换</p><p>具体来说,使用<code>{preserveDrawingBuffer:true}</code>创建WebGL上下文,如</p><pre><code>gl=someCanvas.getContext(“webgl”,{preserveDrawingBuffer:true});</code></pre><p>告诉WebGL您一直希望它进行复制</p><p>默认情况下,WebGL根据各种因素选择交换或复制。例如,如果启用了抗锯齿,那么它始终是一个有效的副本(解决方案),而如果禁用了抗锯齿则可能是一个交换。此外,在这种默认情况下,当执行复制或交换后<code>preserveDrawingBuffer</code>为false时,它将清除backbuffer。这是为了使它看起来一致,而不管它选择复制还是交换</p><p>如果<code>preserveDrawingBuffer</code>=true,则从不清除backbuffer</p><p>如果您想在多个JavaScript事件上完成一系列工作,并且在完成所有工作之前不让用户看到结果,那么您需要使用附加的纹理或renderbuffer渲染到帧缓冲区,然后在完成所有的工作后,将其渲染到画布上(后缓冲区)</p><p>至于<code>gl.finish</code>,这是WebGL中的一个no-op。这没有意义</p>