Лекция #26. Spherical Harmonics [Лектор - xmvlad]
Автор: Vladislav Gusev
оригинальный лог: http://www.everfall.com/paste/id.php?20f4zp1hf2y9
<MiF> давай
<MiF> вещай уже
<xmvlad> надо тогда дисклеймер хотя бы написать чтоб касег не волновался..
<Zeux> пиши свой дисклеймер
<xmvlad> ладно в общем :) данное повествование является разжовыванием теоретических основ SH для тех кто как и
я пропускал матан, в достаточно мере что бы их не знать :)
<xmvlad> 1. линейное пространство
<xmvlad> в общем линейным пространством является все что угодно удовлетворяющее следующим аксиомам:
<xmvlad> http://en.wikipedia.org/wiki/Vector_space
<xmvlad> 1. ассоциативность сложения векторов то есть (a + b) + c = a + (b + c)
<xmvlad> 2. коммутативность a + b = b + a
<xmvlad> 3. существования нуля, то есть для каждого элемента v принадлежащему V (векторному пространству)
существует элемент z такой что v + z = v
<xmvlad> и т.д далее для жаждущих ссылка в википедию
<xmvlad> суть в следующим: одним из примеров линейного пространства может являтся функциональное пространство
<xmvlad> то есть если мы возьмем множество векторных функций f(x), g(x)... Fi(x), то они так же будут являтся линейным пространством
<xmvlad> http://en.wikipedia.org/wiki/Functional_space
<xmvlad> теперь вводим в данном линейном пространстве скалярное произведение
<xmvlad> аксиомы скалярного произведения http://en.wikipedia.org/wiki/Inner_product_space, то есть проще говоря
это обобщение "геометрического" dot product для линейных пространств
<xmvlad> по просьбе cppg: http://ru.wikipedia.org/wiki/Линейное_пространство
<cppg> добавлю, перевод: http://ru.wikipedia.org/wiki/Векторное_пространство
<xmvlad> http://ru.wikipedia.org/wiki/Скалярное_произведение
<xmvlad> теперь, одна теорема которая нам нужна
<xmvlad> Пусть S подпространство в эвклидовом пространстве V, и (e1, ..., ei) ортонормированный базис для S. Если x принадлежит V, тогда элемент s = sum(i = 1, n) (x, ei) * ei - проекция x на S
<xmvlad> значит такая теорема: проекция x на S ближе к x (ближе в смысле нормы), чем любой другой элемент принадлежащий S
<xmvlad> все, с мутью покончили
<xmvlad> значит берем функциональнольно пространство и вводим в нем следующее скалярное произведение:
<xmvlad> (f, g) = integral f(x) * g(x) dx
<xmvlad> как можно убедится удовлетворяет всем аксиомам для скалярного произведения
<xmvlad> базисом этого функционального пространства могут являтся - сферические гармоники
<xmvlad> сферические гармоники принадлежат к семейству ортогональных полиномов
<xmvlad> то есть, (f, g) = 0 если f != g, и (f, f) = 1
<xmvlad> SH(spherical harmonics) задаются на поверхности сферы, то есть x = f(a, b), где a,b - сферические
координаты некоторой точки на поверхности сферы
<xmvlad> тогда, любую функцию заданную на поверхности сферы мы можем задать линейной комбинацией базисных
функций, то есть
<xmvlad> f_aprox(a, b) = s0 * y1 + s1 * y1 + s2 * y2 + .. + si * yi
<xmvlad> если мы берем конечное число гармоник, то есть "обрезаем" высокие частоты мы получаем лишь некоторую
апроксимацию
<xmvlad> наша f_aprox и будет проекцией f (элемента функционального пространства) в базис SH
<xmvlad> при этом в соответствии с теоремой, эта проекция является наилучшим приближением f в базисе SH
<xmvlad> проще говоря, что нам надо - посчитать s0.. si, для этого в соответсвии с определением проецируем f на
базис SH, то есть считаем si = (f, yi) для i = 0..n
<xmvlad> или по нашему определению скалярного умножения si = интеграл по поверхности сферы (f(s) * yi(s)) ds
<xmvlad> зная si, мы можем восстановить нашу функцию f, некоторую апроксимацию, выше написана формула
<xmvlad> но это не главное
<xmvlad> если у нас есть две функции f и g, которые мы спроецировали в базис SH тогда
<xmvlad> в силу ортогональности базисных функций то есть все термы i != g равны 0, остальные i = i, 1
<xmvlad> интеграл по поверхности сферы f(s) * g(s) ds = fs0 * gs0 + fs1 * gs1 + .. + fsi * gsi
<xmvlad> то есть просто дот продукт коэффициентов
<xmvlad> как это обычно используют
<xmvlad> возьмем меш, зададим вокруг каждой вершины функцию f(s), если c направления s - приходит лучик, f(s)
== 1 если нет f(s) == 0
<xmvlad> то есть задаем для каждой вершины объекта oclussion для всех возможных направлений (поверхность сферы)
<xmvlad> вторая функция, g, задает "источник освещения", то же самое только для каждого направления s g(s) == 1
есть лучик g(s)== 0 нет лучика
<xmvlad> теперь если взять интеграл по поверхности сферы произведения этих двух функий f и g, получим
количество освещения достигающего вершину
<xmvlad> а интеграл это всего лишь дот продукт как было выше расписано
<xmvlad> таким образом считаем во время препроцессинга повершинно f
<xmvlad> раз в кадр считаем проекцию освещения в SH базис - g, а затем в шейдере - дот продукт - количестов
освещения (интеграл по поверхности сферы)
<DobroKOT> каким освещением рисовать пиксель на экране?
<DobroKOT> сорри, away, метро закрывается в час.
<xmvlad> DobroKOT: f - освещение
<xmvlad> то есть если хочется цветного их должно быть три штуки :)
<xmvlad> DobroKOT: освещение повершинное
<xmvlad> учитывается только диффузная составляющая (интеграл по поверхности сферы) без спекуляра
<xmvlad> но суть в том что f - можно поретрейсить и закодить туда self-shadowing от объекта
<DobroKOT> xmvlad, я что-то не понимаю.
<xmvlad> да что я забыл сказать, там где было про проецирование в базис, интеграл, можно посчитать и аналитически (если функция простая) или при помощи монте-карло (рейтрейсинг по сцене)
<xmvlad> DobroKOT: говори что %)
<DobroKOT> почему нельзя в offline тупо посчитать освещённость?
<DobroKOT> каждой вершины?
<DobroKOT> тупо lightmap ?
<DobroKOT> что дают SH ?
<xmvlad> смотри
<Zeux> DobroKOT, освещенность относительно статического источника?
<DobroKOT> если "учитывается только диффузная составляющая"
<xmvlad> одну часть f - мы считаем в офлайне повершинно - это локальный occlusion или вобще что угодно
<xmvlad> вторую часть g - мы можем посчитать покадрово, освещение то есть
<xmvlad> а затем в шейдере уже посчитать интеграл по поверхности сферы произведения этих функций - дот продуктом
<xmvlad> при этом g у нас будет не повершинно а для всего объекта
<DobroKOT> что такое oclusion для уровня типа quake1 ? ведь любая точка в этом уровне - внутри уровня?
<DobroKOT> f - это что?
<xmvlad> f - это функция на поверхности сферы, то есть проекция в SH
<DobroKOT> что такое f?
<DobroKOT> если считать что гармоник нет, (бесконечная точность и тп) как она используется для освещения?
<xmvlad> DobroKOT: функция заданная на поверхности сферы, occlusion то есть
<xmvlad> повершинно
<DobroKOT> на выпуклом объекте oclusion везде будет - полусфера?
<DobroKOT> точнее, сфера с одним полушарием - 1, и вторым - 0 ?
<xmvlad> DobroKOT: ага
<DobroKOT> а это же дико разрывная функция.
<DobroKOT> она хорошо приближается гармониками?
<xmvlad> но с оклюжен это простейший случай, можно закодировать что угодно, любую функцию освещения %)
<xmvlad> DobroKOT: ну дык будут "мягкие тени" =) вобще нужен препроцессинг, вроде размытия гаусом
<DobroKOT> как полагается считать f для замкнутого уровня типа кваки?
<xmvlad> не, я имеле ввиду, что считать надо для объекта какого-нить
<xmvlad> то есть для области внутри которой не будет источника света
<DobroKOT> хорошо, умеем считать интеграл в шейдере быстро и приближённо.
<DobroKOT> а как задаётся g ?
<DobroKOT> вообще как задаются источнки света в этом методе?
<xmvlad> а g как хочеш считай =) но суть в том что это опять же функция на поверхности сферы
<DobroKOT> ну вот пусть два точечных источника...
<DobroKOT> ага, в каждой вершине можно задать как dot(n, l1) + dot(n, l2) ...
<xmvlad> DobroKOT: нет :)
<DobroKOT> а как?
<xmvlad> мы сразу все освещение проецируем в базис SH
<DobroKOT> g - одна на все вершины?
<xmvlad> ага
<xmvlad> и поэтому фейк :)
<DobroKOT> ага, тогда n можно подставить как точку сферы.
<DobroKOT> что он позволяет?
<xmvlad> DobroKOT: да он говно, просто этого никто не знает =)
<DobroKOT> неее!
<DobroKOT> сначала скажи почему хороший.
<DobroKOT> вот я туплю и не понимаю, для чего его применять.
<DobroKOT> а, типа g можно сделать сложной, да?
<xmvlad> DobroKOT: да
<xmvlad> да для любого динамического освещения только фейковым оно будет
<xmvlad> то есть вопрос в том - на сколько это будет фейково
14 июня 2006 (Обновление: 18 июня 2006)
Комментарии [1]