Освещение в Минерафтийском Мире

10

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

Таким образом, если у вас есть плавающий остров на вершине вашего мира, все, что находится под ним, будет рассматриваться как пещера. Когда два источника света воздействуют на одну и ту же точку, побеждает более яркий источник света (не уверен в этом).

В любом случае есть несколько проблем с моделью освещения минных судов: во-первых, если в вашем мире нет карты высот, становится сложнее выяснить, что именно должно излучать солнечный свет, а что нет. Простым способом было бы предположить, что мир - это (в моем случае) плавающая скала, а затем пересечь каждую ось в обоих направлениях и выяснить, где скала начинается и заканчивается. Но это не полностью устраняет проблему, так как вмятины в скале не должны находиться во тьме.

Сам Minecraft будет кешировать информацию о свете в своих порциях вместе с информацией о материале блока. Таким образом, только если мир изменился, освещение должно обновиться. К сожалению, этот процесс все еще довольно медленный при обновлении, а при быстрых изменениях освещения можно увидеть отставание освещения. Это особенно верно, если меняется много блоков (TNT, Sunset и т. Д.), И вы не используете самый быстрый компьютер (или Java на Mac).

Из моего все еще ограниченного понимания освещения 3D-графики такой мир, как minecraft, не должен быть самой большой проблемой. Как бы вы решили эту проблему?

Я думаю, что основные требования к освещению в мире вокселей были бы

  1. обновить достаточно быстро, чтобы это могло произойти в одном кадре. Можно было бы включить освещение в графическом устройстве и загрузить измененную информацию о освещении в основное ОЗУ.
  2. светлая информация должна быть быстро доступна для основной логики игры, поэтому она не должна полностью основываться на графическом устройстве: рассуждение: свет влияет на рост травы, нерест монстров и т. д.
  3. Легкие обновления должны быть локальными для чанка или иметь какое-то другое ограничение, чтобы не пришлось заново освещать весь мир, который может быть очень большим по размеру.

Основная идея состоит в том, чтобы сделать светлые обновления быстрыми, не обязательно более красивыми. Для общего улучшения производительности рендеринга света можно легко добавить SSAO поверх того, что должно привести к гораздо более приятным мирам.

Армин Ронахер
источник

Ответы:

7

Освещение в Minecraft рассчитывается асинхронно и запекается в геометрии. Это не сделано в реальном времени.

Каждый воксель хранит освещение для этого вокселя, вероятно, в виде одного байта (или 2, метка использует многоуровневый подход, чтобы сделать возможными дневные и ночные циклы). Есть только 16 уровней света. Чтобы осветить мир, Minecraft делает 2 прохода. Один для солнечного света, а другой для распространения или затопления света в пещерах и тому подобное. Освещение локализовано, потому что любой источник света может распространять свой свет только на расстоянии не более 16 блоков. Вода и лава работают почти одинаково.

Более подробная информация доступна в его блоге: http://notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work

zfedoran
источник
Я знаю. Я думаю, что я написал это выше (минус яркость 4-битное разрешение).
Армин Ронахер
1

Разве вы не можете использовать GPU Render для текстурирования и двойной буферизации ваших результатов, чтобы у вас всегда была вычисленная информация о освещении, доступная для считывания каждого кадра?

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


источник
Именно то, что я думал. Практически все графические процессоры, в отличие от большинства процессоров, предназначены для такого рода параллельных вычислений.
Грант Питерс
1

Люди рендеринга в реальном времени, похоже, любят роман с Minecraft. Был какой-то комментарий о том, что они еще не выяснили освещение ... но вы можете следить за дальнейшими событиями / ссылками.

http://www.realtimerendering.com/blog/?s=minecraft

Улун наркоман
источник