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

Рендеринг волновой оптики. Голограммы.

Страницы: 1 2 3 Следующая »
#0
13:14, 5 апр. 2019

В этом треде хотелось бы пообсуждать возможности и перспективы применения волновой оптики для рендеринга.

+ крипота

Что это такое?


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

Зачем это нужно?


Все (известные мне) существующие игровые и околоигровые движки работают именно в геометрическом приближении, потому что почти все операции, типично встречающиеся в рендеринге, гораздо очевиднее реализуются именно в геометрическом приближении: проекции треугольников на экран, загораживание объектов друг другом, растеризация изображения — все эти операции тривиально выполняются достаточно эффективно в геометрической оптике. Однако, ключевое слово здесь — "почти", так как существуют эффекты, которые либо крайне неудобно рассчитывать в геометрическом приближении (global illumination, reprojection), либо просто невозможно (голограммы, зонные пластинки).

А конкретнее?


Рассмотрим одну из типичных задач современной графики — представление геометрии. Идея в том, что в геометрической оптике двумерной информацией принципиально кодируется двумерная или плоская информация. Например, в двумерной текстуре цвета хранится цвет плоской поверхности. А в волновой оптике двумерное световое поле определяет весь волновой фронт, который через него проходит. Представьте себе текстуру, в которой хранится не информация о поверхности объекта, а информация обо всех объектах, видных через эту поверхность со всех возможных ракурсов.

Приближение чего-то подобного можно получить в геометрической оптике, если использовать текстуру displacement'а, определяющего геометрию поверхности, альбедо, приближающую ламбертовское рассеяние поверхности, текстуру glossiness, определяющую его микрорельеф, нормалмапу, подповерхностную карту, лайтмапу и ещё с полдюжины других карт, которые будут лишь аппроксимировать информацию, которую в волновой оптике можно задать единственно возможной текстурой волнового поля, которая заменяет все возможные карты. Для того, чтобы рассчитать вид объекта с другого ракурса в геометрической оптике, нужно либо делать приближённую репроекцию (не без артефактов), либо заново растеризовать объект. В волновой же оптике достаточно просто пересчитать фазы от волнового поля для другой точки наблюдения и всё остальное работает автоматически, причём не на приближённых моделях, аппроксимирующих реальные процессы, а точно.

Как к этому всему относятся голограммы?


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

Как же это запрограть?


Скажу сразу, что я понятия не имею, как это сделать оптимально. Я реализовал совершенно брутфорсовый метод, который(потенциально) моделирует гораздо больше эффектов, чем минимально необходимо и моделирует их совершенно в лоб без каких бы то ни было оптимизаций. Оптимизации последуют потом, когда свойства метода ясны и его полезность очевидна. Сейчас я нахожусь на стадии экспериментов, когда я просто изучаю свойства такого подхода.

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

На первом этапе сцена у меня представляется как чёрный ящик для raycast'а. Я для тестирования использую просто несколько сфер, но, вообще говоря, это может быть любое BVH-tree или что-то подобное. Для расчёта голограммы я написал что-то вроде path tracer'а в волновом приближении — источник света выпускает множество лучей, которые при пересечении с объектом переотражаются и становятся полноценными точечными волновыми источниками. Я рассчитываю интерференцию этих волновых источников на поверхности, которая отделяет объект от камеры. В самом простом случае это просто плоскость. Интерференционная картина, полученная на этой поверхности — это и есть голограмма объекта.

На втором этапе нужно каким-то образом визуализировать полученную голограмму. В моей реализации для визуализации я явно моделирую влияние тонкой линзы на волновой фронт, которая фокусирует изображение на светочувствительную матрицу камеры, а полученная на матрице интерференционная картина — и есть результирующее изображение. Пост получается больно уж здоровым, поэтому я пока остановлюсь на одном из промежуточных результатов, где я тестировал только второй этап — рассчитывал интерференционную картину, создаваемую самим объектом при освещении когерентным источником. Вот так она выглядит(картинка старая и неправильная, но она мне всё равно нравится):
Изображение
На картинке показано фото микки-мауса, освещённого слева когерентным источником с длиной волны, составляющей примерно 1/100 его характерного размера. Так как линза камеры собирающая, она переворачивает изображение на светочувствительном сенсоре и оно получается перевёрнутым и отражённым слева-направо. Однако, при некотором усилии можно разглядеть центральную сферу, определяющую голову микки-мауса и ухо справа-снизу, заданное ещё одной сферой.

Не хочу пока выкладывать все результаты, потому что уже тут наверняка будут какие-то непонятки. Давайте сначала пообсуждаем.

#1
14:11, 5 апр. 2019

Suslik
> Давайте сначала пообсуждаем.
Так уж получилось, что я этой фигней 10 страдал)
В основном это была обработка полученной интерференционной картины, но были попытки и цифровой голографии. К сожалению в то время мощностей компов не хватало для генерации/восстановления цифровых голограмм, но если копнуть свои старые архивы - могу подкинуть публикации на эту тему, где приведена вся необходимая математика и алгоритмы.

#2
14:12, 5 апр. 2019

Fantom09
публикации и алгоритмы мне не нужны, потому что велосипедить гораздо интереснее. а вот что ты нарендерил — конечно, показывай.

> К сожалению в то время мощностей компов не хватало для генерации/восстановления цифровых голограмм
ой да ладно. ну считалась бы голограмма в 5 (на самом деле меньше) раз дольше, чем у меня сейчас считается. не критично. так что отговорки!

#3
14:17, 5 апр. 2019

ладно, я передумал. давай статьи :D

#4
14:35, 5 апр. 2019

Suslik
Я этим занимался в 2000-х) это еще AMD K62-500 и 16МБ оперативки :)
Там максимум удавалось восстановить что-то по типу игрального кубика, после недели вычислений)
А сейчас мелкомягкие это делают реалтайм в своих hologlass...

Suslik
> вот что ты нарендерил — конечно, показывай
Ок, поищу свои старые публикации, может удастся найти тот самый кубик :)
Но в основном моя задача была восстановление напряженно-деформированного состояния объекта по спекл-интерферограмме, как отрою свои публикации за тот период - покажу картинки.

#5
15:01, 5 апр. 2019

голограмма - это запись волнового фронта, который прошел через ее пластинку, имитируется на компьютере это просто, можно просто реальной сценой и рендером с отсечением по рамке голограммы, либо сгенерировать некую карту высот(или бампмапинг) и по ней шейдером рисовать "а-ля голограмма" с учетом положения камеры, практического смысла в этом не будет пока плотность пикселей мониторов не увеличиться в ~1000 раз, тогда можно будет в рантайм рисовать прямо фронт волны на экране и получить монохромный 3Д дисплей, пока же все это можно заменить 3д очками и трекингом положения глаз с реализацией обычной 3Д сцены (как в hologlass)

#6
15:10, 5 апр. 2019

Fantom09
> сейчас мелкомягкие это делают реалтайм в своих hologlass

Можно подробнее, о чем речь? Это ведь не hololens, которые стереоочки дополненной реальности, к классической интерференционной голографии не имеющие никакого отношения?

А Hologlass - что-то поиск в гугле выдает красивые картинки и какой-то текстовой бред.

#7
18:10, 5 апр. 2019

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

Кстати, собираешься их (для тестов или for fun) как-то печатать?

Интересно, также, насколько внятно делать цвет тупо 3 голограммами (R, G, B), по сравнению со "классической" цветной голографией в толстой пластинке?

#8
18:42, 5 апр. 2019

FordPerfect
> Гм, классическая голограмма - это же интерференция тупо с опорным пучком
> (плоским фронтом), вообще без линз.
саму-то голограмму можно без линзы сделать. только смотреть на неё как? линзу я использую в камере, чтоб голограмму наблюдать.

FordPerfect
> Кстати, собираешься их (для тестов или for fun) как-то печатать?
нет

FordPerfect
> Интересно, также, насколько внятно делать цвет тупо 3 голограммами (R, G, B),
> по сравнению со "классической" цветной голографией в толстой пластинке?
цветные голограммы программировать гораздо проще, чем делать ирл, например, потому что можно сказать, что у всех трёх цветов — одна длина волны. то есть цвет(в смысле отображаемый на экране) вообще не обязан соответствовать используемой длине волны, это плюс.

#9
19:04, 5 апр. 2019

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

+ Показать

А вот так вот выглядит интерференционная картина, с которой приходится работать при цифровой голографии (без фотопластин, сразу на сенсор камеры, пришлось пережать, чтоб на форум влезло):
+ Показать

leonardo98
> можно просто реальной сценой и рендером с отсечением по рамке голограммы
Это похоже на результат простого рендера? :)

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

Dmitry_Milk
> hololens
Да, конечно, опечатался.
Dmitry_Milk
> стереоочки дополненной реальности
Нет, там другая технология. Там линзы покрыты дифракционной решеткой, которая и формирует 3Д картинку, а проектор лишь проецирует предрасчитанное фазовое поле, причем там даже принцип проекции отличается. Буквально недавно попадалась статья с детальным обзором, если принципиально - могу поискать.

Suslik
> ладно, я передумал. давай статьи :D
Ок, буду искать. Это все было как в прошлой жизни)
Но в любом случае стоит погуглить "Digital holography", с тех времен возможно появился более свежий материал, так как в 2010 было всего несколько публикаций на эту тему.

#10
19:26, 5 апр. 2019

Suslik
> саму-то голограмму можно без линзы сделать. только смотреть на неё как? линзу я использую в камере, чтоб голограмму наблюдать.
Не очень понял. В смысле - "смотреть"? Саму голограмму можно получить так же как и физическую - интереференцией твоего волнового поля (полученного вследствие взаимодействия с объектами) с опорным плоским фронтом, взятой в какой-нибудь произвольной плоскости ("фотографии").
Или смотреть восстановленное изображение?

Была, кстати, мысль что интересного можно сделать, залив на DVD-болванку специально подготовленные данные (я, правда, больше о диффракционных пластниках, что можно считать весьма частным случаем голограмм).

#11
19:31, 5 апр. 2019

смотри Maxwell Render

#12
20:22, 5 апр. 2019

FordPerfect
> интереференцией твоего волнового поля (полученного вследствие взаимодействия с
> объектами) с опорным плоским фронтом

Если я правильно его понял, он хочет что-то типа такого:
holo | Рендеринг волновой оптики. Голограммы.
То есть, сохраняет в плоскости голограммы информацию об амплитудах и фазах (суммируя все, что доходит до каждой точки этой плоскости от всех видимых из нее точек объекта), а потом, когда "смотрит" - начинает расчеты от этого распределения амплитуд и фаз в плоскости голограммы, направляя дальше все это в "линзу".

Собственно, хоть опорного пучка нет, суть та же, что за счет чего "работает" обычная габоровская голограмма - принцип гюйгенса-френеля из точек в плоскости голограммы.

#13
20:49, 5 апр. 2019

Suslik
> источник света выпускает множество лучей, которые при пересечении с объектом переотражаются и становятся полноценными точечными волновыми источниками
Формально это правильно и в пределе сходится к нужному результату, однако на практике, насколько я понимаю, это страдает от проблемы знаков и требует экспоненциального времени и точности. Собственно, весь численный квантмех страдает от этого и приходится придумывать всякие хитрые алгоритмы. Однако, вполне может оказаться, что честно решать волновое уравнение на трехмерной сетке будет эффективнее.

> В моей реализации для визуализации я явно моделирую влияние тонкой линзы на волновой фронт, которая фокусирует изображение на светочувствительную матрицу камеры
Хм, интересная идея. Только я бы матрицу запихал на бесконечность (хотя не уверен, что это возможно), потому что на бесконечности изображение строится FFT, которая быстрее произвольной свертки.

FordPerfect
> Интересно, также, насколько внятно делать цвет тупо 3 голограммами (R, G, B), по сравнению со "классической" цветной голографией в толстой пластинке?
Насколько я понимаю, голограмма в толстой эмульсии — это по сути три R, G, B голограммы.

#14
4:08, 6 апр. 2019

FordPerfect
> Не очень понял. В смысле - "смотреть"? Саму голограмму можно получить так же
> как и физическую - интереференцией твоего волнового поля (полученного
> вследствие взаимодействия с объектами) с опорным плоским фронтом, взятой в
> какой-нибудь произвольной плоскости ("фотографии").
> Или смотреть восстановленное изображение?
как ты будешь наблюдать восстановленный фронт от голограммы, когда осветишь ещё опорным излучением? ты получишь просто волновой фронт, а его надо как-то перевести в наблюдаемое изображение. вот для этого я и собрал камеру с линзой.

Polyflow3d
> смотри Maxwell Render
обыкновенный геометрический path tracing

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

}:+()___ [Smile]
> Формально это правильно и в пределе сходится к нужному результату, однако на
> практике, насколько я понимаю, это страдает от проблемы знаков и требует
> экспоненциального времени и точности. Собственно, весь численный квантмех
> страдает от этого и приходится придумывать всякие хитрые алгоритмы.
сейчас у меня две основных проблемы у такого подхода:
1) я не совсем понимаю, правильно ли я работаю с окклюженом. при расчёте интерференции каждого точечного источника на поверхности тела на каждый тексель голограммы, я проверяю его геометрическую видимость в направлении этого текселя. то есть один и тот же точечный источник может иметь вклад в одни тексели и не иметь вклада в другие. это вообще правильно?
2) у моей камеры/глаза получается очень сильная "избирательность". то есть, грубо говоря, depth of field эффект разблюривает очень сильно всё, что хоть немного не попало в фокус. я не понимаю, почему в реальных камерах этот эффект не настолько сильный. может ли быть это из-за того, что у меня моделируется линза с бесконечно большой апертурой, а в реальной жизни апертура достаточно маленькая?

}:+()___ [Smile]
> Хм, интересная идея. Только я бы матрицу запихал на бесконечность (хотя не
> уверен, что это возможно), потому что на бесконечности изображение строится
> FFT, которая быстрее произвольной свертки.
тут тоже, кстати, очень интересный момент — по идее, если камера сфокусирована на объекте, то голографическую пластинку можно поместить в любое место между объективом и объектом и всё должно работать. однако, я заметил, что результаты сходятся к одному и тому же решению, но с удивительными сайд-эффектами. например, если пластинку поставить ближе фокусного расстояния, то изображение у каждого элемента пластинки получается мнимое и находится перед матрицей — для восстановления такого волнового фронта нужно просто считать интерференцию его элементов на матрице как обычных точечных источников. однако, если голограмма находится достаточно далеко, то изображение голограммы находится за матрицей и для восстановления волнового фронта нужно считать _отрицательную_ длину волны, как бы пуская волну назад во времени. как это вообще объясняется физически? наконец, если голограмма находится ровно в фокусе, то изображения точечных источников уходят на бесконечность и у меня просто всё делится на ноль.

по идее все эти жуткие преобразования можно свести к fft каким-то образом. но я пока над этим не парюсь, хочу просто изучить свойства.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

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