Новые примеры

Добавил в коллекцию примеров Dagon свою старую демку с планетой – она показывает, как создавать пользовательские шейдеры. Каждый объект сцены использует специализированный шейдер: звездное небо, газовый гигант с эффектом рассеивания света в атмосфере, кольца с тенью.

Также добавлен пример создания ландшафта и многослойного материала для него.

Subsurface Scattering в Dagon

В Dagon наконец-то появилась качественная аппроксимация подповерхностного рассеивания – фича, которую я в том или ином виде пытаюсь реализовать уже не первый год. Идею позаимствовал из Disney BRDF.

(далее…)

Inform 7

Исследуя свободные игровые движки, случайно наткнулся на настоящий бриллиант – платформу для создания текстовых квестов Inform 7. Это штука, не имеющая аналогов – декларативный язык программирования, использующий естественный синтаксис английского (NLP-система). То есть, программы на нем пишутся в форме обычного текста, состоящего из определений и утверждений. Система позволяет вводить любые новые понятия и абстракции, сущности и их свойства. Получившееся в результате семантическое содержание и составляет логику игры, которая затем транслируется в стандартный код для Z-машины. Таким образом, исходник квеста представляет собой своего рода книгу, которая описывает мир игры, ее сценарий, возможности игрока, отношения и взаимодействия между игровыми сущностями и т.д.

До этого я еще не встречал NLP-системы с такой “человеческой” онтологией, ведь обычно взаимодействие с компьютером строится на математико-логическом аппарате, на классах, структурах и алгоритмах, а не на бытовом способе мыслить и разговаривать. В Inform 7 нет никаких структур и даже типов данных – есть лишь языковые инструменты, позволяющие вам выстроить ваш собственный понятийный аппарат, на основе которого будет работать игра.

Жанр классических текстовых квестов, уходящий корнями в культовый Zork, обычно предполагает перемещение игрока по карте воображаемого мира, как в ролевых играх – Inform включает в себя стандартные понятия для описания карты и соответствующий рантайм с готовым интерпретатором команд перемещения. Вы описываете мир как совокупность абстрактных “комнат”, указывая их расположение относительно друг друга (“К востоку от дома расположено озеро”). Потенциально так можно создать все, что угодно – хватило бы фантазии.

Например, впервые сев за Inform, я залип на целый вечер и написал набор определений, описывающий автомат с конфетами и напитками – игрок имеет некоторое количество денег и может делать покупки в автомате. Что такое “деньги”, и что означает “покупать” – это тоже определяет программист. Для этого приходится подключать какие-то особые мозговые доли: Inform заставляет вас думать по-новому, с изрядной долей креативности! Я бы назвал эту платформу философской машиной – в ней нужно мыслить как философ от инженерии, выстраивать в голове сложные абстракции, придумывать свои собственные системы категорий. И мне почему-то кажется, что на одних только текстовых квестах свет клином не сошелся – Inform потенциально можно использовать для каких-то инновационных способов взаимодействия с информацией, в качестве компонента базы знаний, как мощный инструмент прототипирования и описания различных моделей. Обязательно продолжу экспериментировать.

https://ganelson.github.io/inform-website/

Сжатие текстур, часть II. RGTC

Продолжение серии постов о сжатых текстурных форматах. Первая часть тут.

RGTC (BC4, BC5)

Red Green Texture Compression

Форматы сжатия для 1- и 2-канальных изображений – условно “красных” и “красно-зеленых”. Разработаны ATI (ныне AMD), поддерживаются всеми современными десктопными видеокартами.

BC4 (также известный как RGTC1, ATI1 и 3Dc+) предназначен для хранения монохромных изображений (не обязательно красных, разумеется). Формат использует 64 бита на блок 4×4. Endpoint’ы хранятся в виде 8-битных значений, из них создается 6 промежуточных значений. Индексы пикселей 3-битные. Преимущество BC4 – значительно более высокое качество при хранении монохромных текстур, чем при использовании BC1. Это делает формат самым подходящим выбором для карт высот и различных нецветовых данных, таких как шероховатость и металличность. Качество градиентов почти неотличимо на глаз от несжатого оригинала.

BC5 (также известный как RGTC2, ATI2 и 3Dc) хранит двухканальные изображения, условно называемые “красно-зелеными”. Принцип сжатия аналогичен BC4, только в данном случае каждый блок 4×4 описывается двумя каналами по 64 бита каждый, при этом красный и зеленый каналы сжимаются независимо друг от друга. В BC5 удобно хранить, например, совмещенные текстуры шероховатости и металличности.

Стандарт RGTC определяет текстуры со знаком и беззнаковые. Они полностью идентичны, разница лишь в том, что формат со знаком кодирует значения от -128 до 127, а не от 0 до 255. Для формата со знаком действует правило: если первый endpoint равен -127, второй не должен быть -128.

Стриминг уровней

Пост на правах идеи – реализации пока нет даже в черновом виде, поэтому пока сложно сказать, появится ли эта фича в следующей версии Dagon.

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

Я планирую написать систему, предназначенную для перемещений преимущественно на плоскости – как правило, по поверхности планеты. Мир разбивается на 2D сетку с каким-то заданным шагом – например, 100×100 метров. Каждая ячейка сетки представляет собой отдельный ресурс, который можно создать и загрузить независимо от остальных. По умолчанию игра загружает только “домашнюю” ячейку, в которой находится игрок в начале пути, а также 8 соседних ячеек. Таким образом, видимыми и интерактивными для игрока одновременно являются 9 ячеек. В зависимости от размера ячейки и особенностей игры этот параметр, скорее всего, можно будет настраивать – также, возможно, для далеких ячеек можно будет отображать LOD’ы. Когда игрок перемещается в соседнюю ячейку, игра подгружает необходимые отсутствующие в памяти ячейки, если они существуют, и выгружает ячейки, ставшие слишком далекими. Загрузка будет происходить в фоновом потоке, по возможности без прерывания геймплея.

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