Gamedev LectureСтатьи

Лекция #11. Atmospheric scattering [Лектор - Sark7]

Автор:

Disclaimer: некоторые опечатки поправлены, некоторые реплики передвинуты. полный лог

[00:07] <Sark7> атмосфера состоит из множества маленьких и не очень частиц
[00:08] <Sark7> лучи света поглощаются и отражаются от них
[00:08] <Sark7> мы можем посчитать это рассеивание
[00:09] <Sark7> оно выглядит как L = L0*Fex + Lin
[00:09] <Sark7> где L0 - это исходный свет, Fex - фактор поглощение и out-scattering, а Lin - in-scattering свет
[00:10] <Sark7> поглощение можем посчитать так:
[00:10] <Sark7> введем коэфф. поглощения
[00:11] <Sark7> b(h) = b0 * e^(-a*h)
[00:11] <Sark7> так как плотность частиц меняется по экспоненциальному закону
[00:11] <Sark7> a - это decay factor, зависящий от типа частиц
[00:11] <Sark7> h - функция расстояния от наблюдателя
[00:12] <Sark7> этот коэфф также зависит от длины волны
[00:12] <Sark7> представим h(x) как h0 + x * cos(phi)
[00:13] <Sark7> значит:
[00:14] <Sark7> b = b0 * u(x), где u(x)=e^(-a(h0+x*cos(phi))
[00:15] <Sark7> коэффициент поглощения и out-scattering (их мы рассматриваем вместе) будет соотв.
[00:15] <Sark7> Fex = e^(-I(0..s, b(x) dx)
[00:16] <Sark7> т.е. интеграл по линии взгляда
[00:17] <Sark7> считаем его и получаем Fex=e^(-K(H-u(s)), где K = -b0/(a*cos(phi)) и H=e^(-ah0)
[00:18] <Sark7> это не все, еще есть in-scattering
[00:17] <Sark7> есть вопросы?

[00:19] <Zeux> да, будь ближе к народу, расскажи, как это юзать, и все такое.
[00:19] <Sark7> откуда берется Fex
[00:19] <CrackedMind> дада, где это и как применять (: еще бы демку где это пказывается
[00:19] <Sark7> ссылки я дам, да
[00:19] <Sark7> ну, получаются формулы, их юзаешь и счастье приходит
[00:20] <Sark7> есть конкретные вопросы? :)

[00:25] <Zeux> у кого нет sunsky.pdf - www.cs.utah.edu/~shirley/papers/sunsky/sunsky.pdf

[00:26] <Sark7> для упрощения можно считать что атмосфера состоит из очень маленьких частиц
[00:26] <Sark7> радиус << длины волны
[00:26] <Sark7> и частиц с радиусом сопоставимым с длиной волны
[00:27] <Sark7> для первых товарищ Rayleigh вывел известную формулу
[00:27] <Sark7> еще в 19 веке
[00:27] <Sark7> я не буду ее приводить, она длинная
[00:28] <Sark7> главное, что коэфф. рассеивания в ней обратно пропорционален четвертой степени длины волны
[00:28] <Sark7> поэтому синий цвет рассеивается сильнее всего
[00:28] <Sark7> соотв. поэтому у неба синий цвет
[00:29] <Sark7> однако цвет зависит не только от in-рассеивания
[00:30] <Sark7> коэфф. out-рассеивания дает красный цвет неба на закате и рассвете
[00:30] <Sark7> потому что его значение становится сопоставимым с in-рассеиванием
[00:30] <Sark7> из-за возросшей оптической длины атмосферы
[00:31] <Sark7> частицы второго типа
[00:31] <Sark7> с радиусом ~ длины волны
[00:31] <Sark7> описываются теорией товарища Mie
[00:31] <Sark7> довольно сложной и общей
[00:32] <Sark7> точнее, Mie теория описывает вообще любые частицы, но проще для маленьких частиц использовать Rayleigh формулу
[00:32] <Sark7> частицы ~ длины волны описывают, например, почему туман белый )
[00:33] <Sark7> давайте уже вопросы
[00:33] <Sark7> к этой части
[00:34] <Sark7> да, коэфф. рассеивания в формуле Mie для атмосферы обратно пропорционален квадрату длины волны... поэтому не так сильно зависит от нее

[00:35] <Zeux> пусть стоит задача - нарисовать небо. Я правильно понимаю, что нужно нарисовать некоторую геометрию, как-то приближающую небо, для которой в каждой ее точке высчитать цвет по формулам, приведенным выше?
[00:35] <Sark7> есть разные подходы
[00:35] <Sark7> в общем случае, да
[00:36] <Sark7> так сделал Хоффман в ati_light_scattering
[00:36] <Sark7> для очень упрощенной мат модели

[00:36] <neteraser> а вот я дезайнер. я хочу шоб сцуко как в Crysis красиво было! Смарю - никрасиво, что мне можно или нужно тыкать, крутить, вертеть?
[00:36] <Sark7> neteraser, фотоаппарат )
[00:37] <neteraser> нифига. я хочу шоб солнышко двигалось взад-и-обратно
[00:38] <Sark7> neteraser, много фотоаппаратов )

[00:36] <Zeux> h0 - высота наблюдателя, h - высота точки. phi - это угол между вектором от наблюдателя к точке и горизонтальной плоскостью, x - это длина проекции вектора от наблюдателя до точки неба?
[00:37] <Sark7> между вектором и вертикальной плоскостью
[00:37] <Sark7> x - расстояние от наблюдателя до точки
[00:37] <Zeux> вертикальной?
[00:37] <Sark7> да
[00:37] <Zeux> так, дальше. Что такое b0 ?
[00:38] <Zeux> И как подбирать a?
[00:38] <Zeux> чисто эмпирически?
[00:38] <Sark7> b0 - это коэфф. рассеивания на уровне земли
[00:38] <Sark7> можно рассматривать их как 2 коэфф.
[00:38] <Sark7> rayleigh и mie
[00:39] <Sark7> для каждого есть формулы, а общий коэфф. считается сложением их )

[00:39] <Zeux> ок, дальше - правильно ли я понимаю, что результирующий свет зависит от положения солнца? Свет, поступающий от солнца - это L0?
[00:40] <Sark7> L0 - это исходная радиация наблюдаемой точки
[00:41] <Sark7> т.е. без скаттеринга было бы - Fex = 1, Lin = 0; и получили бы L=L0
[00:41] <Zeux> хм, что значит "исходная"?
[00:41] <Zeux> просто без влияния рассеивания?
[00:41] <Sark7> да

[00:40] <Zeux> и, наконец - in-scattering - это что? Рассеивание для "больших" частиц?
[00:41] <Sark7> out-scattering - это рассеивание света "из" линии взгляда
[00:42] <Sark7> т.е. свет который должен был бы придти к нам в глаз, но не пришел
[00:42] <Sark7> in-scattering - это свет который не должен был бы придти к нам в глаз, но пришел
[00:42] <Zeux> ага, ок, примерно ясно.

[00:54] <Sark7> кроме полного коэфф. рассеивания
[00:54] <Sark7> нам нужен еще и угловой
[00:54] <Sark7> т.е. зависящий от угла под которым идет луч света
[00:54] <Sark7> это достигается умножением полного коэфф. на фазовую функцию
[00:55] <Sark7> для каждого из 2-х типов частиц она своя
[00:55] <Sark7> для Rayleigh - (1+cos^phi)
[00:56] <Sark7> для Mie - используется henyen-greenstein функция
[00:57] <Sark7> посчитаем Lin
[00:57] <Sark7> там будет злобный интеграл
[00:58] <Sark7> Lin = I(L(w)*b(w, phi, psi, h) )dw
[00:58] <Sark7> где w - это solid angle падающего луча
[00:59] <Sark7> phi, psi - направление взгляда
[00:59] <Sark7> интегрирую, получаем - L0(phi, psi)*u(x)
[00:59] <Sark7> где L0 - это свет падающий в направление взляда на уровне земли
[01:00] <Sark7> расписываем на 2 типа частиц:
[01:01] <Sark7> а, сорри, то был не L а S
[01:01] <Sark7> т.е. свет без учета поглощения и out-scattering
[01:01] <Sark7> для L нужно домножить на коэфф. Fex
[01:01] <Sark7> и еще раз проинтегрировать, теперь по пути s
[01:02] <Sark7> далее идет еще более злобные формулы
[01:02] <Sark7> получаем:
[01:03] <Sark7> Lin = S01(theta,phi)*I1 + S02(theta,phi)*I2
[01:03] <Sark7> для обоих видов частиц
[01:03] <Sark7> где Ii = I(0..s, ui(x)*Fex(x) dx)
[01:04] <Sark7> расписывая функции ui(x) и Fex(x), для aerial perspective можно принять что
[01:04] <Sark7> s*cos(phi) будет << 1
[01:04] <Sark7> и проинтегрировать аналитически
[01:05] <Sark7> чорт, как-то сумбурно
[01:05] <Sark7> ладно, я думаю смысла уже не имеет дальше рассказывать
[01:05] <Sark7> это конечные формулы
[01:05] <Sark7> лучше ссылок
[01:06] <Sark7> референсный пейпер - sunsky.pdf
[01:06] <Sark7> и там же референсный код
[01:06] <Sark7> еще есть шейдерная реализация в ShaderX3
[01:06] <Sark7> очень хорошая
[01:06] <Sark7> ну и простейшая реализация - в ATI-LightScattering.pdf
[01:07] <Sark7> там берут рассеивание по 3-м лучам - R, G, B, что не очень правильно, но кое-что получается
[01:07] <Sark7> вопросы? :)

[01:08] <Zeux> во-первых, какие могут быть упрощения в формулах? В смысле, что можно выкидывать, etc.
[01:14] <Sark7> ну, главное упрощение что s*cos(phi) << 1 :)
[01:14] <Sark7> хоффман и товарищи как-то еще более упростили
[01:15] <Sark7> там вообще половины коэфф. нет
[01:15] <Zeux> а в out-scattering?
[01:15] <Sark7> но и результат соответствующий
[01:15] <Zeux> там какие-то страшные косинусы, экспоненты
[01:15] <Zeux> хотя, конечно, не смертельно
[01:15] <Sark7> Zeux, яхз, я давно за aerial perspective не брался, не помню уже
[01:17] <Sark7> Zeux, просто достаточно многое вычисляется в препроцессе
[01:17] <Sark7> т.е. не зависит от собственно углов и s
[01:18] <Zeux> ага.

[01:10] <Zeux> во-вторых, пусть есть sky dome. Насколько плохо считать значения per-vertex? Возможно ли по-нормальному сделать per-pixel - т.е. с нормальным fps?
[01:11] <Sark7> честные per-pixel вычисления сделать практически нереально
[01:11] <Sark7> либо лукап-текстурами, но там тоже будет зависеть лишь от разрешения этих текстур
[01:11] <Sark7> per-vertex вполне возможно

[01:12] <Sark7> демка вроде была на http://www.marcospoerl.com
[01:12] <Sark7> из ShaderX3

Страницы: 1 2 Следующая »

4 февраля 2006 (Обновление: 25 фев 2006)

Комментарии [3]