为什么WebGL'清楚'吸引前缓冲?

时间:2015-10-25 08:17:49

标签: javascript webgl

为什么不需要swap-buffers或glFinish?

<!DOCTYPE html>
<html>
    <head>
        <title>Game v.0.0</title>
        <script>
            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 = "<a>WebGL NOT SUPPORTED? :(</a>";
                        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;
                    }
                };
            }
        </script>
        <style type="text/css">
            canvas {border: 2px dotted blue;}
        </style>
    </head>

    <body onload="startGame()">
        <div><canvas id="gameCanvas" width="640" height="480"></canvas></div>
    </body>

</html>

1 个答案:

答案 0 :(得分:4)

因为这就是WebGL的工作方式。

WebGL自动交换/复制。任何时候你做任何影响WebGL drawingBuffer的事情(想想&#34; backbuffer)它都被标记为交换/复制。下次浏览器合成网页时,它将进行交换或复制。你可以告诉它总是复制。你不能告诉它总是交换

具体而言,使用{/ 1}创建WebGL上下文,如

{preserveDrawingBuffer: true}

告诉WebGL你总是希望它能够复制。

默认情况下,WebGL会根据各种因素选择交换或复制。例如,如果抗锯齿处于打开状态,它总是有效地复制(解析),就好像抗锯齿处理一样,它可能是一个交换。此外,在此默认情况下,当gl = someCanvas.getContext("webgl", {preserveDrawingBuffer: true}); 在执行复制或交换后为假时,它将清除后备缓冲区。这是为了使其看起来一致,无论它是选择复制还是交换。

如果preserveDrawingBuffer = true,那么它永远不会清除后备缓冲区。

如果你想在多个JavaScript事件上做很多工作,并且在完成所有工作之前不让用户看到结果,你需要渲染到带有附加纹理或渲染缓冲区的帧缓冲区,然后当所有工作都是完成渲染而不是附加到画布(后备缓冲区)。

至于preserveDrawingBuffer,这是WebGL中的无操作。没有意义。