ПрограммированиеФорумГрафика

Волновая оптика вместо уравнения рендеринга (19 стр)

Страницы: 114 15 16 17 18 19
#270
7:02, 10 янв 2023

Имбирная Ведьмочка
ещё, кстати, так как ты напрямую подошёл к вопросу голограмм, фактоид: при восстановлении голограмм (численном или физическом) всегда будет трейдофф: глубина резкости <-> чёткость. это значит, что ты можешь восстановить либо очень чёткое изображение с практически нулевой глубиной резкости (то есть один его зрез по оси z), если использовать большую апертуру, либо ты можешь восстановить большой диапазон глубины, но очень нечётко, если использовать малую апертуру (в пределе — камеру-обскуру с беконечной глубиной резкости и бесконечно низким разрешением).

ты сейчас восстанавливаешь изображение с бесконечно большой апертурой по факту, то есть такое изображение будет восстанавливаться корректно только для одного среза.

#271
16:23, 10 янв 2023

Suslik
> по закону sin⁡(k|x−x0|+k|x0|).

что за гавно ты опять придумал? в векторах всегда было e^ik*(r-r0), где * - скалярное произведение.
если k направлен к r0 то это вырождается в e^iK|x-x0|

#272
5:09, 23 фев 2023

Имбирная Ведьмочка
по поводу артефактов интерференции. вот тут я моделировал голограмму 3д объекта:
Изображение
волновое поле этого лизарда закодировано в растровом срезе волнового поля разрешением (если мне не изменяет память) 2к х 2к. вместе с параллаксом, окклюженом, запечённым освещением итп. ясное дело, запекать можно любое освещение, включая view-dependent вроде спекуляра, преломления и каустик.

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

основное отличие от того, что я делал с 3д голограммами против того, что мы делаем тут — я моделировал поле только на поверхностях, пропуская то, что происходит в пространстве между поверхностями. к сожалению, единственный способ, как я это придумал — это "протаскивать" двумерный срез через пространство (обрати внимание на артефакты на руках лизарда из-за дискретного шага между "сканирующими" плоскостями). это, ясное дело, не особо эффективно, но, "протащив" поле один раз, угол его обзора можно тривиально поворачивать, эффективно "осматривая" волновое поле с разных сторон, что и делается в гифке в реалтайме. то есть медленно запрягаем/быстро едем — это очень полезное в графике качество.

вообще как "наблюдать" волновое поле, то есть как его перевести в изображение объекта — это тоже, блин, целая эпопея, потому что я лично не придумал, как это делать по-нормально и делаю это криво, выстраивая камеру-обскуру и наблюдая только часть голограммы через апертуру. это значит, что в каждом кадре присутствует только малюсенькая часть голограммы, попавшая в апертруру, куча информации теряется и не знаю, как сделать по-нормальному. но даже так оно, в общем-то, работает.

то есть я всё равно склоняюсь к идее, что сам способ кодирования волновых полей через 2д срезы — это ультимативный способ кодирования данных и он принципиально масштабируется гораздо лучше, чем геометрическое представление. если такое поле уже рассчитано, то его можно рендерить в реалтайме уже сейчас. вопрос по сути лишь в том, как его использовать для расчёта освещения. тут возникла идея: что если таким "протаскиванием" плоскостей считать не только отображение объекта, но таким же образом "протаскивать" фронт освещения? трудностью я здесь вижу то, что протаскивания в одном направлении явно не будет достаточно, потому что свет не будет распространяться против направления "протаскивания". однако, неверно будет и сказать, что свет будет распространяться только параллельно направлению "протаскивания", так как параллакс вполне себе кодируется.

ещё меня по-прежнему беспокоит твой тест в посте 235. что именно происходит с мнимой частью сигнала? почему только она теряется, если заключить объект в голографическую поверхность? почему параллакс работает в случае бесконечной плоскости, но перестаёт работать (???) в случае ограничивающей поверхности? почему теряется только мнимания часть сигнала и насколько это вообще важно?

если кому-то интересно я могу опубликовать исходники, но сразу скажу, что разобраться в подлежащей математике по этим исходникам абсолютно невозможно. on the bright side я в тот раз всё сделал правильно и для каждой функции оставил комментарий с пейпером, из которого её можно вывести.

#273
10:08, 23 фев 2023

Suslik
> ясное дело, запекать можно любое освещение
Нет, не любое — только полигонов, которые непосредственно "видны" из голограммы. В indoor-сцене, например, нужно будет как минимум по голограмме на комнату.

Suslik
> ещё меня по-прежнему беспокоит твой тест в посте 235.
Поле из голограммы восстанавливается правильно только в пустом пространстве. Источник света — это не пустое пространство, соответственно, поле за ним получается неправильное — с противоположной фазой.

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

Соответственно, в случае голограммы для комнаты — её нужно ставить посередине, чтобы была прямая видимость до стенок.

#274
11:32, 23 фев 2023

Имбирная Ведьмочка
> Нет, не любое — только полигонов, которые непосредственно "видны" из голограммы.
запечь можно освещение от чего угодно, включая полигоны, которые не видно. но как это сделать с помощью fft — не ясно.

> Поле из голограммы восстанавливается правильно только в пустом пространстве. Источник света — это не пустое пространство, соответственно, поле за ним получается неправильное — с противоположной фазой.
но ведь ты же сам восстанавливал поле в ящике: действительная часть восстанавливается везде. можно её сдвинуть на pi / 2 и получится, считай, мнимая часть. однако, всё равно остаётся вопросом, как избежать этого странного финта ушами.

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

насколько я понимаю, восстановленная от бесконечно протяжённой голограммы волновая картина совпадает с исходной, если каждый источник заменить на диполь. вот тут у тебя иллюстрация:
Изображение

отсюда вопрос: это вообще на что-то влияет? потому что наблюдается такой диполь точно так же, если смотреть в произвольном направлении "через" голограмму.

в одном я точно уверен: это не должно быть препятствием к тому, чтобы этим пользоваться. препятствия могут быть в чём-то другом, но фундаментально это никак не влияет на асимптотику плотности хранения информации. фундаментально идея кодирования монохроматичного 3д светового поля, используя, 2д фазовую картину, по-прежнему остаётся в силе. смотри на лизарда выше, сам способ хранения информации работает! да, точечные источники заменяются на диполи, но визуально это вообще, возможно, не наблюдаемо. надо только понять, как научиться считать освещение напрямую в этом представлении.


ещё давай вот эту картинку обсудим, иненсивность поля восстановленного диполя:
Изображение
выглядит жутко. но учти, что у меня у лизарда каждая точка переизлучает свет в случайной фазе. это вообще-то важный момент, и если фазу не смещать, то получается что попало. смайл говорил, что если фазу не смещать, должно получиться зеркало, а если смещать, то диффузная поверхность, но по моим экспериментам, если фазу не смещать, то получается чёрт знает что, а не зеркало. так вот суть в том, что если составить поверхность из вот таких точечных источников с рандомными фазами, то они интерферируют во что-то примерно непрерывное, как доктор прописал.

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

#275
14:45, 23 фев 2023

Suslik
Я правильно понимаю, что ты по сути закодировал множество небольших изображений вида объекта с разных сторон в одном изображении высокого разрешения?

#276
19:31, 23 фев 2023

Ну смотри, как я это понимаю.

Когда мы восстанавливаем голограмму — мы по факту решаем диффур:

    \(\displaystyle \nabla^2 a_s = - k^2 \ a_s\)

Мы как бы нашли аналитическое решение для ситуации, когда на какой-то заранее заданной плоскости, \(a_s = 0\) везде кроме одной дифференциальной площадки; а затем суммируем эти решения для множества площадок, из которых составлена исходная голограмма, по свойству линейности исходного уравнения. И так просто совпадает, что это единичное аналитическое решение выглядит, как поле диполя.

Однако, это уравнение — оно описывает только пустое пространство. Если нам нужна отражающая или поглощающая поверхность — на ней диффур будет другой. Если в сцене присутствуют источники — диффур тоже будет другой, источники дадут дополнительные слагаемые.

И в итоге получается, что если пространство не пустое (в нём есть источники, границы раздела и прочие нерегулярности) — то поле диполя просто больше не является решением. И даже если мы и найдём аналитическое решение, оно будет своё в каждой точке — потому что, из-за этих нерегулярностей, уравнение больше не инвариантно к трансляции.

То есть, метод восстановления голограммы, где ты одну плоскость переводишь сразу в другую через ффт — работает только в пустом пространстве, потому что является решением диффура для пустого пространства. Если пространство не пустое — придётся либо решать "вручную", на конечных элементах, с полной о(в кубе) 3д-текстурой для поля; либо использовать совершенно другие методы, например, иметь сразу несколько голограмм и выбирать/интерполировать между ними по условию прямой видимости.

#277
3:32, 24 фев 2023

Panzerschrek[CN]
> Я правильно понимаю, что ты по сути закодировал множество небольших изображений вида объекта с разных сторон в одном изображении высокого разрешения?
в последней демке с блёстками? я бы сказал, что каждая блёстка кодирует информацию о цвете одной точки исходного объекта под одним углом. то есть одна блёстка кодирует один луч. то есть там нет N фиксированных направлений обзора объекта, так как количество этих направлений равно количеству пикселей.

Имбирная Ведьмочка
> То есть, метод восстановления голограммы, где ты одну плоскость переводишь
> сразу в другую через ффт — работает только в пустом пространстве, потому что
> является решением диффура для пустого пространства.
суть в том, что в методе "протаскивания" плоскости, с которым работает лизард, каждый шаг состоит из двух частей:
1) протаскиваем плоскость на dx
2) обнуляем каждую точку плоскости _внутри_ геометрии.

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

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

вот, например, проблема, над которой я бьюсь в данный момент:

пусть у нас есть один точечный источник. мы берём его голограмму на бесконечной плоскости рядом с ним. вопрос: как из этой голограммы восстановить _точку_? не функцию грина на экране, а одну точку? потому что любые мои потуги восстановить поле, восстанавливают поле точечного источника, то есть функцию грина, которая, конечно, имеет сингулярность в центре, поэтому она имеет бесконечную яркость в центре и спадающий по функции грина "хвост". но можно ли восстановить на экране именно одну точку без "хвоста"? или в уравнении гельмгольца вообще точек не существует и имеет смысл только рассуждать о точечных источниках, которым соответствует функция грина вместе с "хвостом"?

#278
10:58, 24 фев 2023

Suslik
> то есть там нет N фиксированных направлений обзора объекта
А как без этого?

Если бы я делал такое, то я бы отрендерил объект с NxN разных направлений, после чего построил бы изображение, состоящее из квадратов NxN и в каждой ячейке этого квадрата хранился бы пиксель одного из направлений.

> одна блёстка кодирует один луч
А как выбирается - какой именно луч?

#279
11:30, 24 фев 2023

Panzerschrek[CN]
> Если бы я делал такое, то я бы отрендерил объект с NxN разных направлений,
> после чего построил бы изображение, состоящее из квадратов NxN и в каждой
> ячейке этого квадрата хранился бы пиксель одного из направлений.
это создаёт артефакты, если смотреть между выбранными NxN направлениями. рандом лучше тем, что в пределе ты покрываешь все направления и нет необходимости выбирать никакой произвольный N. по-хорошему, чтобы снизить шум, тут надо было где-то впилить blue noise, но я не стал заморачиваться.

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

#280
17:58, 3 мар 2023

Suslik
> насколько я понимаю, восстановленная от бесконечно протяжённой голограммы
> волновая картина совпадает с исходной, если каждый источник заменить на диполь.
> вот тут у тебя иллюстрация:
Кстати, нет, там получается не диполь, а что-то мутное и непонятное.

Во-первых — там распределение энергии по углам тупо "неправильное". Если посчитать энергию у диполя — там получается что-то типа \(1/r \ (\cos \alpha)^2\); у этой картинки же — та самая жуть, которую ты показал ниже, с какими-то непонятными волнами.

Я пытался наобезьянить аналитическую формулу для мнимой части восстановленного поля, но не получилось. Во всяком случае, там точно не простой бессель.

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

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

#281
15:01, 4 мар 2023

Забавно
В 2011 завел подобную тему но попроще
Меня не поняли и послали

#282
15:20, 4 мар 2023

подобную тему но попроще

Куда уж проще :)

#283
18:26, 4 мар 2023

Ну и как - где волшебные формулы для улучшения рендеринга? 12 лет прошло.

#284
18:51, 4 мар 2023

Skvoznjak
Все как писал суслик
Уравнения Максвелла :)

Страницы: 114 15 16 17 18 19
ПрограммированиеФорумГрафика

Тема в архиве.