Webgl обновить регион с помощью окна просмотра + ножницы - PullRequest
2 голосов
/ 16 марта 2012

Я пытался создать приложение 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 Ответ

2 голосов
/ 17 марта 2012

Вы можете использовать атрибут preserveDrawingBuffer:

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

Не рекомендуется использовать это в производстве. Спецификации WebGL гласят:

Хотя иногда желательно сохранить буфер рисования, он может вызвать значительную потерю производительности на некоторых платформах. Всякий раз, когда возможно, этот флаг должен оставаться ложным, а другие методы используются. Такие методы, как синхронный доступ к буферу рисования (например, вызов readPixels или toDataURL в той же функции, которая выполняет буфер рисования) может использоваться для получения содержимого буфера рисования. Если автору необходимо выполнить рендеринг в один и тот же буфер рисования в серии вызовов, можно использовать объект Framebuffer.

Этот вопрос SO также содержит соответствующую информацию, касающуюся preserveDrawingBuffer: Когда WebGL решит обновить дисплей?

...