关于javascript:为什么WebGL \\’clear \\’吸引到前端缓冲区?

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")的操作时,都会将其标记为交换/复制。下一次浏览器合成网页时,它将执行交换或复制操作。您可以告诉它始终复制。无法告诉它总是交换

具体来说,使用{preserveDrawingBuffer: true}作为

中的内容来创建WebGL上下文

1
gl = someCanvas.getContext("webgl", {preserveDrawingBuffer: true});

告诉WebGL您始终希望它进行复制。

默认值为WebGL根据各种因素选择交换或复制。例如,如果启用了抗锯齿功能,则它始终始终是一个副本(解决方案),而仿效处理功能已关闭,则它可能是一个交换。同样,在这种默认情况下,当preserveDrawingBuffer执行复制或交换后为false时,它将清除后备缓冲区。这是为了使它看起来是一致的,而不管它是选择复制还是交换。

如果preserveDrawingBuffer = true,则从不清除后缓冲区。

如果要在多个JavaScript事件上进行大量工作,并且在完成所有工作之前不让用户看到结果,则需要渲染到具有附加纹理或渲染缓冲区的帧缓冲区,然后在所有完成工作比渲染到画布(后缓冲区)要好。

至于gl.finish,这在WebGL中是不可操作的。没有意义。