Ошибка рисования WebGL после щелчка мышью - PullRequest
0 голосов
/ 23 марта 2012

У меня есть вспомогательный метод drawRect(p1, p2), который рисует прямоугольник (в ортографической проекции). Код работает нормально, если я сделаю это:

function webGLStart() {
    // initialization code

    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.uniformMatrix4fv(shaderProgram.pMatrixLoc, false, pMatrix);

    drawRect(new Point(10, 10), new Point(50, 50));
}

Теперь предположим, что я хочу визуализировать новый прямоугольник после каждого щелчка мышью. Поэтому я очистил холст, настроил матрицу проекции и переместил вызов drawRect в обработчик мыши. И это не работает.

function webGLStart() {
    // initialization code

    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.uniformMatrix4fv(shaderProgram.pMatrixLoc, false, pMatrix);

    canvas.onmousedown = handleMouseDown;
}

function handleMouseDown(event) {
    // x, y depends on click coordinate
    drawRect(new Point(x, y), new Point(x + 20, y + 20));
}

Весь холст исчезает после щелчка мышью. Однако, если я храню информацию обо всех прямоугольниках в массиве и в обработчике мыши, я очищаю холст, а затем рисую все прямоугольники из массива, тогда проблем нет. Другими словами, если я перерисовываю всю сцену, то проблем нет.

Итак, мой вопрос: нельзя ли рисовать один за другим, не очистив весь холст и не обновив все?

1 Ответ

3 голосов
/ 23 марта 2012

Если вы хотите «сохранить» фон, вы должны использовать флаг preserveDrawingBuffer:

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

Смотрите эти последние ответы:

Когда WebGL решит обновить дисплей?

Регион обновления Webgl с использованием окна просмотра + ножниц

...