Войти
Gamedev LectureСтатьи

Лекция #26. Spherical Harmonics [Лектор - xmvlad]

Автор:

оригинальный лог:  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> xmvlad, что такое f?
    <DobroKOT> каким освещением рисовать пиксель на экране?
  • DobroKOT тупит, наверное...

  • <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 - это что?
  • dR|drunk is now known as dR|phone

  • <xmvlad> DobrKOT: occlusion для некоторого объекта :)
    <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 не понимает, как метод который не может осветить кубическую комнату с одним точечным источником света является супер-методом.

  • <DobroKOT> а почему он крутой?
    <DobroKOT> что он позволяет?
    <xmvlad> DobroKOT: да он говно, просто этого никто не знает =)
    <DobroKOT> неее!
    <DobroKOT> сначала скажи почему хороший.
    <DobroKOT> вот я туплю и не понимаю, для чего его применять.
    <DobroKOT> а, типа g можно сделать  сложной, да?
    <xmvlad> DobroKOT: да
    <xmvlad> да для любого динамического освещения только фейковым оно будет
    <xmvlad> то есть вопрос в том - на сколько это будет фейково

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

    14 июня 2006 (Обновление: 18 июня 2006)

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