为什么不需要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>
答案 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中的无操作。没有意义。