Хранение в памяти
Мир игры представляет из себя матрицу 256 на 256 вокселей, и 8 в глубину. Каждый воксель содержит информацию о цвете освещённости и индекс материала. На каждую компоненту вокселя выделяется байт информации, потому движок поддерживает не более 256 различных материалов. Каждый материал, в свою очередь, состоит из цвета, и коэффициентов прозрачности и плотности.
Камера расположена от воксельной сетки на расстоянии, равной её ширине. Таким образом любой луч падает на её поверхность под углом не менее 45 градусов. Это позволяет сильно упростить общий алгоритм трассировки лучей в воксельной сетке, поскольку, проходя один воксель в глубину, луч пересекает вертикальную и горизонтальную границу вокселя не более одного раза.
Так, реализация шейдера представляет из себя простой цикл в 8 итераций (константное количество итераций позволяет OpenGL эффективно разворачивать циклы), на каждом шаге которого происходят одна проверка на пересечение с соответствующей границей, которая при необходимости обрабатывается.
Расчёт освещения
Динамическое освещение запекается в самой сетке перед отрисовкой, таким образом имитируются сложные эффекты вроде теней и объёмного освещения.
Для расчёта освещения выделяется временная сетка, элементы которой принимают значения от 0 до 1. Изначально объём вокселей, соответствующих источнику света, инициализируется в 1. Затем происходит проход по вокселям, лежащим на границе этой области. Для каждого вокселя находится предыдущий воксель, лежащий по направлению источника света. Из него берётся исходное значение интенсивности, и затем, с учётом материала текущего вокселя, рассчитывается интенсивность текущего. Этот этап итеративно повторяется до тех пор, пока не заполнится весь выделенный объём временного контейнера.
Итоговый цвет рассчитывается как значение интенсивности, умноженное на значение цвета источника освещения, и делённое на квадрат расстояния до него (свет распространяется согласно закону обратных квадратов).
Трассировка лучей
Для каждого пикселя изображения пускается луч. Луч содержит единственное число - его интенсивность.
При столкновении с вокселем к результату прибавляется цвет вокселя, умноженный на интенсивность текущего луча, освещённость предыдущего вокселя и коэффициент прозрачности нового вокселя. Интенсивность самого луча при этом уменьшается на величину, обратную прозрачности.
Когда луч выходит из вокселя, к результату прибавляется свет, рассеянный внутреннем пространством вокселя - произведение текущей интенсивности луча, цвета вокселя, его освещённости, и коэффициента, зависящего от того, какое расстояние прошёл луч внутри вокселя. При этом и сам луч рассеивается на значение, обратное этому коэффициенту.
Этот процесс происходит итеративно. При этом, когда луч выходит из вокселя, он тут же оказывается в следующем, и снова применяется первая итерация.
Результат
В итоге получается достичь визуальных эффектов, достаточно сложно реализуемых при использовании классической полигональной графики. Таких, как объёмное освещение, динамические тени и прозрачность материалов.
Хотя движок и показывает хорошую производительность в конкретной игре, некоторые алгоритмы могут представлять потенциальную вычислительную сложность при попытке их масштабирования. Самой значительной проблемой является сложность расчёта освещения. Также, отрисовка и обработка больших воксельных матриц может быть оптимизирована такими структурами данных, как воксельное октодерево, или VDB.