Привет, я написал оригинальный композитор WebGL для melonJS.
tl; dr: принудительно перерисовать фрейм, возвращая true
из метода entity.update()
вашего персонажа.(Или, в качестве альтернативы, увеличьте частоту кадров анимации в соответствии с частотой кадров игры.)
Пример переопределения метода update
:
update: function (dt) {
this._super(me.Entity, "update", [dt]);
return true;
}
Это позволяет обновлению продолжать работу в обычном режиме (например,обновление состояния анимации и т. д.), но возвращая true
, чтобы заставить кадр каждый раз перерисовываться.
Это может помочь понять, как работает композитор и как ваш шейдер взаимодействует с объектами melonJS.Это описывает внутреннюю работу интеграции WebGL с melonJS.Короче говоря, нет явного шага для привязки позиций к шейдеру.Позиции отправляются через буфер атрибутов вершины, который группируется (обычно для всего кадра) и отправляется как один большой массив в WebGL.
Композитор по умолчанию можно заменить, если вам нужен больший контроль над построением вершиныбуфер, или если вы хотите сделать другие пользовательские проходы рендеринга.Это делается путем передачи ссылки на класс me.video.init
в аргументе options.compositor
.По умолчанию me.WebGLRenderer.Compositor
:
me.video.init(width, height, {
wrapper: "screen",
renderer : me.video.WEBGL,
compositor: me.WebGLRenderer.Compositor
});
Во время цикла отрисовки композитор по умолчанию добавляет новый элемент quad в буфер массива атрибутов вершины для каждого вызова me.WebGLRenderer.drawImage
.Этот метод эмулирует метод холста DOM с тем же именем.Реализация очень проста;он просто преобразует аргументы в квадрат и вызывает метод композитора addQuad
.Именно здесь фактически заполняется буфер атрибутов вершины.
После того, как буфер атрибутов вершины завершен, вызывается метод flush
, который отправляет буфер вершин в графический процессор с помощью gl.drawElements
.
melonJS доводит оптимизацию рисования до крайности.Он не только выполняет пакетную обработку с возможностью рендеринга, чтобы уменьшить количество вызовов отрисовки (как описано выше), но также не отправляет любые вызовы отрисовки, если отрисовать нечего.Это условие возникает, когда кадр идентичен последнему нарисованному кадру.Например, ни одна сущность не переместилась, область просмотра не прокрутилась, незанятые анимации не перешли в следующее состояние, экранный таймер не прошел целую секунду и т. Д.
Возможно принудительно вызвать кадрчтобы перерисовать, если какая-либо сущность в сцене возвращает true
из ее метода update
.Это сигнал игровому движку о том, что кадр нужно перерисовать.Этот процесс более подробно описан в вики .