Minecraft - это игра, которая в значительной степени основана на карте высот и использует информацию карты высот, чтобы наполнить мир светом. Насколько я понимаю, самая высокая точка в карте высот - это конец области, на которую воздействует солнечный свет. Все, что выше этого, освещено солнечным светом, все, что ниже этого, находится под влиянием света в радиусе 8 блоков.
Таким образом, если у вас есть плавающий остров на вершине вашего мира, все, что находится под ним, будет рассматриваться как пещера. Когда два источника света воздействуют на одну и ту же точку, побеждает более яркий источник света (не уверен в этом).
В любом случае есть несколько проблем с моделью освещения минных судов: во-первых, если в вашем мире нет карты высот, становится сложнее выяснить, что именно должно излучать солнечный свет, а что нет. Простым способом было бы предположить, что мир - это (в моем случае) плавающая скала, а затем пересечь каждую ось в обоих направлениях и выяснить, где скала начинается и заканчивается. Но это не полностью устраняет проблему, так как вмятины в скале не должны находиться во тьме.
Сам Minecraft будет кешировать информацию о свете в своих порциях вместе с информацией о материале блока. Таким образом, только если мир изменился, освещение должно обновиться. К сожалению, этот процесс все еще довольно медленный при обновлении, а при быстрых изменениях освещения можно увидеть отставание освещения. Это особенно верно, если меняется много блоков (TNT, Sunset и т. Д.), И вы не используете самый быстрый компьютер (или Java на Mac).
Из моего все еще ограниченного понимания освещения 3D-графики такой мир, как minecraft, не должен быть самой большой проблемой. Как бы вы решили эту проблему?
Я думаю, что основные требования к освещению в мире вокселей были бы
- обновить достаточно быстро, чтобы это могло произойти в одном кадре. Можно было бы включить освещение в графическом устройстве и загрузить измененную информацию о освещении в основное ОЗУ.
- светлая информация должна быть быстро доступна для основной логики игры, поэтому она не должна полностью основываться на графическом устройстве: рассуждение: свет влияет на рост травы, нерест монстров и т. д.
- Легкие обновления должны быть локальными для чанка или иметь какое-то другое ограничение, чтобы не пришлось заново освещать весь мир, который может быть очень большим по размеру.
Основная идея состоит в том, чтобы сделать светлые обновления быстрыми, не обязательно более красивыми. Для общего улучшения производительности рендеринга света можно легко добавить SSAO поверх того, что должно привести к гораздо более приятным мирам.