Для каждого источника строится буфер глубины, по нему определяются грани видимой источником геометрии. Эта информация записывается в тот же фреймбуфер и имеет такое же разрешение, что и тени. А затем для неё строится цепочка мип-уровней. Таким образом, если мы будем сэмплировать из более низких уровней, получим оптимальное покрытие в тех местах, где тень должна размываться - на границах.
А можно подробней расписать процесс, происходящий между шагами? Какое разрешение имеет получившаяся маска? Почему стенка за источником света полностью покрыта маской?
Дополнил статью под скриншотами 😉
Только сейчас увидел часть коммента про стенку, покрытую маской. Да, это неприятная особенность, возникает из-за угла наклона, под которым камера "смотрит" на стенку. Очень крутые углы вызывают сильные перепады в буфере глубины и алгоритм считает эти перепады разными гранями. Плюс, из-за остроты угла, один сэмпл маски может покрывать всю стену по высоте.
На самом деле, это не супер-критично, потому что эта стенка вся покрыта маской только для этого источника. Для остальных, ситуация, скорее всего, будет другая и они не будут обрабатывать всю стенку целиком. Тогда как без маски, целиком обрабатывались бы все поверхности в переделах досягаемости, каждый раз для каждого источника.
Комментарий недоступен
Название для Force Engine придумал даже не я, а мой друг, просто подставив мой ник в название - Force. А я подумал, а почему нет?
Вроде бы последний дум делает нечто подобное со статической частью шэдоумап. Так что, ты предвосхитил эту технологию 😉.
Расскажешь о своём движке?
Прошу простить, а движок будет в открытом доступе? Его можно купить, скачать бесплатно? Уж очень мне нравится ваша работа. И удачи вам!
Спасибо! ;) Да, я склоняюсь к полуоткрытому распространению, по типу Юнити. Пока, к сожалению, API не готово, поэтому опубликован он будет не в ближайшее время. Но это в планах.