1

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

<!DOCTYPE html><html><头部><title>游戏v.0.0<脚本>var gl=空;函数startGame(){{var canvas=document.getElementById('gameCanvas');var glNames=[“webgl”,“experimental-webgl“,”webkit-3d“,”moz-webgl;for(var glNameI=0;glNameI<glNames.length;++glNameI)尝试{gl=画布.getContext(glNames[glNameI]);如果(gl)断裂;}捕获(e){}如果(!gl){canvas.outerHTML=“不支持WebGL?:(</a>”;回报;}}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);断裂;}};}</script><style type=“text/css”>画布{边框:2px点蓝色;}</style></头><body onload=“startGame()”><div><canvas id=“gameCanvas”width=“640”height=“480”></cavas></div></body></html>
1
  • 供参考“网络工具包-3d”“moz-webgl”自WebGL于4年前发布以来,一直没有相关性 评论 2015年10月25日15:45

1答案1

重置为默认值
7

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

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

具体来说,使用创建WebGL上下文{preserveDrawingBuffer:true}如中所示

gl=someCanvas.getContext(“webgl”,{preserveDrawingBuffer:true});

告诉WebGL您总是希望它进行复制。

默认情况下,WebGL根据各种因素选择交换或复制。例如,如果启用了抗锯齿,那么它始终是一个有效的副本(解决方案),而如果禁用了抗锯齿则可能是一个交换。此外,在这种默认情况下,当保留DrawingBuffer如果是false,则在执行复制或交换后,将清除后台缓冲区。这是为了使它看起来一致,而不管它选择复制还是交换。

如果保留DrawingBuffer=true,则从不清除后台缓冲区。

如果您想在多个JavaScript事件上完成一系列工作,并且在完成所有工作之前不让用户看到结果,那么您需要使用附加的纹理或renderbuffer渲染到帧缓冲区,然后在完成所有的工作后,将其渲染到画布上(后缓冲区)。

至于gl.饰面这是WebGL中的no-op。这毫无意义。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.