У меня есть вспомогательный метод 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));
}
Весь холст исчезает после щелчка мышью. Однако, если я храню информацию обо всех прямоугольниках в массиве и в обработчике мыши, я очищаю холст, а затем рисую все прямоугольники из массива, тогда проблем нет. Другими словами, если я перерисовываю всю сцену, то проблем нет.
Итак, мой вопрос: нельзя ли рисовать один за другим, не очистив весь холст и не обновив все?