masterspammer (masterspammer) wrote,
masterspammer
masterspammer

Сеточка, блин!

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

Похоже, придётся мне делать серию про одномерную графику.

----

Жуки вообще-то чит на чите by design. Одним из читов является одномерная графика.

Если говорить кратко, то пространство нарезается на "ломтики", каждый из которых приводится к одной линии итогового отображаемого двумерного растра. Нарезка не по горизонтали и не по вертикали (это редкие частные случаи) а строго по проекции направления солнечного света на горизонтальную плоскость. Да-да, как раз для того, чтобы получить нормальные тени.

Ограничения - нет переотражений света, вид только сверху (в моём случае, в общем виде может и не обязательно), как впрочем и задумывалось, двойных теней не будет (хммм. пока писал, придумал как их сделать), то есть если есть солнца, то на свет от луны плевать (у нас так и есть из-за разницы в яркости, ничего, не страдаем) а ещё всякая светящаяся "магия" не сможет затеняться предметами. Ну ладно, светлячки не отбрасывают тени, ну да и хрен с ними.

Как отбрасывается тень? Для каждой (очередной) точки на прямой основания (2d преобразуется в 1d) есть высота тени - то есть высота самого высокого встреченного предмета. Если очередная точка ВЫШЕ тени, то она освещена (и высота тени дальше будет равна ей высоте), иначе точка затенена. Вот самый грубый случай - для лучей параллельных поверхности и предметов без дырок.

Для негоризонтального освещения высота тени с каждой следующей точкой снижается на определённую величину (тангенс угла падения), а для предметов с дырками считаем, что над тенью ландшафта есть битовая маска (не)прозрачности. Можно обойтись и только достаточно большой маской (сдвигая её вниз ступеньками, чтоб в среднем походило на тот тангенс - как у Брезенхэма), но ландшафт (карта высот) заведомо без дырок, а от воксельных жуков тянуть тень сильно уж далеко необязательно, так что для диапазона высот во много тысяч хватит одного числа и маски из бит этак 128 - а тот кто выше 128 считаем что тени не отбрасывает (ну можно ещё сделать чтобы плотность тени с высотой изменялась плавно).

---

У меня сегодня оказалось, что при освещении почти с севера (линия сканирования идёт почти вертикально, но иногда перескакивает на соседний столбец) в некоторых местах (там где полого в направлении север-юг, но круто - запад восток) при перескакивании высота изменялась скачком а одномерный алгоритм не знал причин и стоил ступенчатую тень. Получался этакой муар. Вылечилось вычислением средней высоты из той, что на этой линии и той что на следующей, куда перескочить - коэффициенты для смешивания уже были известны - перескок делается по переполнении байта-аккумулятора в результате переодического добавления к нему заранее известной константы. Что осталось после переполнения - доля (с поправкой что это [0..256) а не [0..1), что несложно) высоты из следующей линии, а её дополнение (то есть 256-a) - доля текущей.

UPD: явно придётся писать с картинками и формулами. Математики ОЧЕНЬ много.
Tags: xbugs, ФиксикиПокусали
Subscribe

  • Voodoo practice

    Ковырялся в коде и (что хуже) конфигах проекта, связанного с фильтрацией. Секс-товары (200 сочетаний со словом "анальный" - легко, а с "вагинальный"…

  • (no subject)

    На неделе периодически "кормил" себя приятными занятиями, музыку слушал, один раз проспал почти 12 часов. Сил прибыло. За выходные внезапно очень…

  • (no subject)

    Дети притащили из школы ротовирус - так-то это довольно регулярная болячка, хотя штаммами разнится как грипп - на этот раз досталось сыну и чуть…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments