Нормально рисовать отдельный объект в WebGL. Если у вас более 1 объекта и вы используете объекты массива вершин (VAO), тогда
во время инициализации
for each object
create a vertex array object VAO and bind it
create all the buffers for this object
setup all the attributes for this object
во время отрисовки
for each object
bind the VAO for this object
set uniforms for this object (and optionally bind textures for this object)
draw
Такда, если вы рисуете только одну вещь, то связывание VAO дважды может показаться странным, но схема связывания VAO один раз во время инициализации и снова во время рисования является обычной вещью, потому что обычная вещь - рисоватьнесколько объектов.
Обратите внимание, что это ничем не отличается от любого другого API с сохранением состояния. Например, Canvas 2d API. Вы могли бы написать это
ctx.fillStyle = 'red';
function renderLoop(time) {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.fillRect(x, y, 20, 20); // assume X and Y are animated
...
}
Но опять же, это ненормально - рисовать только одну вещь, поэтому большинство людей, даже если они только начинают с 1, сделают это
function renderLoop(time) {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.fillStyle = 'red';
ctx.fillRect(x, y, 20, 20); // assume X and Y are animated
...
}
Даже еслиизбыточно устанавливать fillStyle
каждый кадр. Они делают это, потому что они ожидают нарисовать больше вещей позже, так что это становится шаблоном для установки состояния, связанного с вещью, которую вы хотите нарисовать, прямо перед тем, как нарисовать .
function renderLoop(time) {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.fillStyle = 'red';
ctx.fillRect(x, y, 20, 20); // assume X and Y are animated
ctx.fillStyle = 'blue';
ctx.fillRect(x2, y2, 20, 20); // assume x2 and y2 are animated
...
}
Каксостояние VAO см. this и состояние текстуры см. this