Render Script для начинающих. 1. Изменение цвета фона отрисовки. [Defold без боли]

Если вам поможет это материал в обучении, буду искренне благодарен вам за то, что вы не поленитесь порекомендовать его для начинающих!


Предисловие


В жизни каждого игрового разработчика на Defold наступает момент, когда ему необходимо заглянуть в рендер скрипт.

В этом уроке мы попробуем проникнуть в таинство рендер скрипта Defold.

Этот и последующие уроки будут являться базовыми “кирпичиками” на пути к общему понимаю концепции Render и рендер скрипта в Defold.

Сразу предупреждаю, я новичок и учусь вместе с вами, поэтому я не претендую на экспертность и не обладаю глубокими знаниями в области компьютерной графики. Если вы укажете мне на ошибку, я буду вам признателен в этом. Я приветствую обратную связь.

На данный момент я вынужден опустить теоретическую часть и сделать упор на получении практического опыта в Defold при работе с рендер скриптом. За это меня извините.

В этом уроке мы просто изменим цвет фона отрисовки игры.


Начинаем…


Откроем пустой проект.
Скопируем файлы, необходимые при работе с рендером в Defold из встроенной папки builtins/render в любую другую за пределы builtins:

Я скопирую эти файлы в созданный мной каталог(папку) my_render:

Можете переименовать файлы, можете их оставить с таким же названием.

Перейдём в default.render и изменим на скопированный ранее рендер скрипт:


Изменим в game.project наш рендер:


Теперь перейдём в наш default.render_script:
image

Выделяем весь код с помощью сочетаний клавиш ctrl + A и удаляем всё выделенное:
Ничего не должно остаться.


Вставляем такой код:

function init(self)

end

function update(self)

end

Создадим в функции init(self) свойство скрипта clear_color:

self.clear_color = vmath.vector4(0.0, 1, 1, 0)

Что мы сделали?

Мы присвоили переменной self.clear_color значение красного цвета.

Цвет в игровом движке, в Defold, задаётся с помощью комбинации, состоящих из четырёх значений, которые являются компонентами vector4() (вектор с 4 компонентами). Подробнее о векторах: (Математика в 3D играх. Векторы)

Эти четыре значения соответствуют цветовой модели RGBA, которая используется в компьютерной графике.
R — Red (красный),
B — Blue (голубой),
G — Green (зелёный),
A — Alpha (прозрачность).

Как это на практике?

Давайте перейдём в game.project и изменим стартовое значение фона отрисовки рендера для компонента Red:

Сохраните настройки проекта с помощью сочетания клавиш (ctrl + S) и запустите проект (crtl + B):

Проделайте подобные манипуляции с численными значениями каждого компонента.
Например, получите цвет фона:

  • Голубой
  • Зелёный
  • Жёлтый
  • Бирюзовый
  • Серый
  • Белый

Не пренебрегайте этим заданием, вы должны усвоить то, что цвет и оттенки цвета в компьютерной графике — это смесь компонентов.

В компьютерной графике принято “втискивать” значения для цвета в диапазон от 0 до 1 (любой компонент имеет минимальное значение от 0 до 1). Это действительно удобно. Мы можем использовать десятичные числа для того, чтобы задать любой цвет.

Поэтому, оранжевый оттенок вы можете получить с помощью таких значений:


Давайте получим белый цвет:

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

Давай вернёмся к нашему рендер скрипту:
image

К нашему коду:

function init(self)
    self.clear_color = vmath.vector4(0.5, 0, 0.5, 0)
    render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color})
end

function update(self)
    
end

Сохраним проект и запустим.
Мы видим, что цвет не изменился.

Почему?

Потому что Рендер, иногда его называют Real-time rendering — это постоянный процесс (в реальном времени) отрисовки компьютерной графики на экране наших устройств.
И наша игра как мультикадровая анимация обновляется и отображается на дисплее.
Поэтому нам нужно рисовать каждый кадр картинку.

Переместим эту строчку в функцию update():

render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color})

Полный код:

function init(self)
    self.clear_color = vmath.vector4(1, 0.5, 0, 0)
    
end

function update(self)
    render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color})
end

Вывод на экран:

Вот она, магия.

render.clear() в Defold очищает буфер кадра (экран) перед отрисовкой новой сцены, заполняя его указанным цветом (по умолчанию чёрным или цветом фона), что необходимо для удаления предыдущего кадра и предотвращения “следов” от спрайтов и эффектов, готовя чистый холст для новой отрисовки.

render.BUFFER_COLOR_BITэто константа в модуле render Defold, которая представляет собой бит-флаг (метку) для буфера цвета (color buffer). Она используется, чтобы указать, какой буфер нужно очистить или задействовать в функциях рендеринга.

Простыми словами:

  • Буфер цвета — это “холст” в памяти, где хранятся цвета всех пикселей на экране (RGB или RGBA).
  • Эта константа помогает сказать движку: “Работай именно с цветами экрана” (а не с глубиной или маской).

В вышеприведённом примере выше мы присвоили значение переменной self.clear_color. А render.clear() каждый кадр заполняет буфер этим значением.
Буфер — это низкоуровневая штука в GPU-памяти (framebuffer), и clear его перезаписывает заново, в последующий уроках мы обязательно затронем эту тему…


Задания на дом:

Почитать об self.clear_color:

Найти и посмотреть видео на похожую тему: “Как устроены дисплеи компьютеров/смартфонов/телевизоров”.
Например:


Всем спасибо за внимание!