Webgl使用viewport + scissor更新区域

时间:2012-03-16 18:53:28

标签: html5 canvas webgl viewport

我一直在尝试创建一个multiviewport webgl应用程序。

我使用viewport + scissor为每个视图渲染了一切。 但是现在我想改进渲染并只渲染更新的视图,所以跳过透支。 我做了一个小小的演示,展示了这个想法:http://kile.stravaganza.org/lab/js/scissor/

据我所知剪刀,它只会渲染当前的剪刀盒,并保持画布的其余部分不受影响。但无论我尝试什么,它似乎只是在每一帧上清理整个画布:(

这是渲染代码(最后一个视图,它只被渲染一次并保留在每一帧上):

function drawScene()
{
    gl.clearColor(1.0, 0.0, 0.0, 0.0);
    gl.scissor(0,0,200,200);
    gl.viewport(0,0,200,200);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    drawFigures();

    gl.clearColor(0.0, 1.0, 0.0, 0.0);
    gl.scissor(200,0,200,200);
    gl.viewport(200,0,200,200);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    drawFigures();

    gl.clearColor(0.0, 0.0, 1.0, 0.0);
    gl.scissor(200,200,200,200);
    gl.viewport(200,200,200,200);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    drawFigures();

    // Render just once   
    if (first)
    {
        gl.clearColor(1.0, 1.0, 0.0, 0.0);
        gl.scissor(0,200,200,200);
        gl.viewport(0,200,200,200);
        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
        drawFigures();
        first=false;
    }
}

任何想法我怎么能达到这个效果?

非常感谢您提前

1 个答案:

答案 0 :(得分:2)

您可以使用preserveDrawingBuffer属性:

gl = canvas.getContext("experimental-webgl", { preserveDrawingBuffer: true });

不建议在生产中使用它。 WebGL specifications州:

  

虽然有时需要保留绘图缓冲区,但它可以   在某些平台上造成重大性能损失。每当   可能此标志应保持为false并使用其他技术。   同步绘图缓冲区访问等技术(例如,调用   readPixels或toDataURL在渲染到的相同函数中   绘图缓冲区)可用于获取绘图缓冲区的内容。   如果作者需要在一系列渲染到相同的绘图缓冲区   对于调用,可以使用Framebuffer对象。

此SO问题还包含有关preserveDrawingBufferWhen WebGL decide to update the display?

的相关信息