Форум

Получить в буфер область отрисовки

02 февраля 2016 22:08 #7061
Здравствуйте.
Я использую встроенный игровой движок blender . Там мне необходимо считывать часть изображения игровой области как набор RGB-значений каждого пикселя. Для этого использую функцию bgl.glReadPixels.
Возможно ли как-либо достичь этого в blend4web? Иначе говоря, можно ли в b4w загрузить в массив цветовые значения отдельной (или всей) области отрисовки?

И второй вопрос. Возможно ли в b4w сохранять изображения (например скриншот области отрисовки) во внешний файл?
Заранее спасибо.


03 февраля 2016 10:05 #7068
Добрый день и добро пожаловать на форум.


Иначе говоря, можно ли в b4w загрузить в массив цветовые значения отдельной (или всей) области отрисовки?

Да, можно, поскольку для рендеринга используется html-элемент canvas.
Можно использовать следующую схему для получения массива с данными о цветности пекселей.

И второй вопрос. Возможно ли в b4w сохранять изображения (например скриншот области отрисовки) во внешний файл?

У нас есть аддон, который позволяет делать скриншоты. Используется у нас в приложении Viewer (доступно в SDK):


При необходимости, можно написать свою функцию для реализации скриншота, по аналогии с указанным аддоном.
Разработчик Blend4Web
06 февраля 2016 18:47 #7184
Разбираясь в том, как считать пиксели в буфер, столкнулся с некоторыми проблемами. Я написал небольшое webGL приложение без blend4web, чтобы понять, как это реализовать эту функцию, и я успешно получил пиксели в буфер. Но перенести на страницу с интегрированным b4w не получается. Причина в следующем: чтобы применить функцию readPixels нужно выполнить одно из двух условий:
1. Установить флаг preserveDrawingBuffer (источник)
2. Перерисовать область canvas перед самым вызовом readPixels
Как реализовать это с b4w, пока не могу понять.
07 февраля 2016 13:23 #7190
Есть функция, которая позволяет реализовать логику после завершения рендеринга.



У меня получилось считать пиксели в массив (правда пришлось добавить строку в код движка). Сделал следующее:
var render_cb = function() {var canvas= b4w.container.get_canvas(); var gl = canvas.getContext("experimental-webgl"); var pixelValues = new Uint8Array(4); gl.readPixels(10, 35, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixelValues); console.log(pixelValues)}
b4w.main.set_render_callback(render_cb)

Создал функцию-callback, в ней читаю данные из контекста webgl. Пришлось добавить {preserveDrawingBuffer: true} в код движка. Если вы работаете с "незакомпиленой" версией движка (не прошедшей обфускацию и слияние всех модулей в один файл), то могу вам посоветовать добавить эту строку в код движка:
Вам будет нужен файл SDK/src/config.js 31 строка
exports.context = {
    alpha              : true,
    antialias          : false,
    premultipliedAlpha : true,
    preserveDrawingBuffer: true
}

Завтра более подробно посмотрю что с этим можно сделать
Разработчик Blend4Web
07 февраля 2016 19:11 #7195
Огромное спасибо!!! Работает!
08 февраля 2016 00:37 #7198
К сожалению, возникла новая проблема
Сделал два пробных проекта, один реализован с модулем app, другой без него.
В обоих идёт вывод цвета пикселя в консоль.
Но данные выводятся вперемешку с нулевыми данными. Со всеми проектами в составе SDK такой проблемы нет.
Конечно, можно нулевые данные отфильтровывать, но это лишняя нагрузка на систему, хорошо бы получать только значимые данные.
У себя файл SDK/src/config.js изменил в соответствии с вышеуказанным.
Архивы с проектами прикрепил, взгляните пожалуйста.
08 февраля 2016 10:04 #7200
Вы используете b4w.min.js в качестве движка. Если вы произвели изменения в исходных кодах движка, то вам надо пересобрать b4w.min.js. Либо использовать несобранный движок. Попробуйте пожключить скрипты из директории SDK/src к вашему проекту. Весь список скриптов можно получить, вызвав скрипт mod_list.py из SDK/scritps/
Разработчик Blend4Web
08 февраля 2016 11:19 #7206
Да уж… действительно. Что-то я совсем не внимателен, заработался. Добавил нужный параметр напрямую в b4w.min.js, без пересборки, теперь всё работает как надо.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.