В OpenGL (и других систем) коэффициент затухания расстояния для точечных ламп является то , как 1/(c+kd+sd^2)
, где d
расстояние от света и c
, k
и s
являются константами.
Я понимаю sd^2
компонент, который моделирует хорошо известное физически точное затухание в "законе обратных квадратов", ожидаемое в реальности.
Я предполагаю, что константа c
, обычно одна, предназначена для очень маленьких значений d
(и, возможно, для деления на ноль защиты?).
Какую роль играет линейный kd
компонент в модели (по умолчанию k
в OpenGL ноль). Когда бы вы использовали другие значения для k
? Я знаю, что это называется компонентом «линейное затухание», но какое поведение он моделирует в модели освещения? Кажется, это не проявляется ни в одной физической модели света, о которой я знаю.
[РЕДАКТИРОВАТЬ]
Дэвид Гувейя отметил, что линейный фактор может быть использован для того, чтобы «приблизить» сцену к тому, что задумал разработчик / художник, или чтобы лучше контролировать скорость, с которой свет падает. В этом случае мой вопрос звучит так: «Есть ли у линейного коэффициента ослабления физический аналог или он просто используется как фактор выдумки, чтобы помочь контролировать качество света в сцене?»
Ответы:
Свет от точечных источников падает с квадратом расстояния. Это физическая реальность.
Линейное затухание часто считается превосходящим. Но это верно только при работе в нелинейном цветовом пространстве. То есть, если у вас нет активной гамма-коррекции. Причина довольно проста.
Если вы записываете линейные значения RGB на нелинейный дисплей без гамма-коррекции, то ваши линейные значения будут искажены встроенной гамма-шкалой монитора. Это эффективно затемняет сцену по сравнению с тем, что вы на самом деле намеревались.
Принимая гамму 2,2, ваш монитор будет эффективно повышать все цвета до уровня 2,2 при отображении.
Это линейное затухание
1/kd
. Это линейное затухание гаммы рампы монитора применяется:1/(kd)^2.2
. Это довольно близко к правильным отношениям в обратном квадрате.Но фактический обратный квадрат:
1/sd^2
становится:1/((s^2)(d^4.4))
. Это заставляет ослабление света падать намного резче, чем ожидалось.В общем, если вы используете правильную гамма-коррекцию (например, рендеринг в кадровый буфер sRGB), вы не должны использовать линейное затухание. Это не будет выглядеть правильно. На все . И если вы не используете гамма-коррекцию ... что с вами не так;)
В любом случае, если вы пытаетесь имитировать реальность, вам нужен обратный квадрат (и гамма правильная). Если нет, то вы можете делать все, что вам нужно для вашей сцены.
источник
Гибкость .
Потому что вы можете захотеть, чтобы ваши огни погасли линейно. Это там, чтобы дать вам такую степень контроля. Это не обязательно должно быть физически точным (и все уравнения освещения затенения фонга также, конечно, не являются физически точными).
Иногда квадратичная модель слишком быстро излучает свет около источника и оставляет «белые блики» на близлежащих поверхностях. Предоставляя линейные и постоянные коэффициенты, вы можете настраивать результаты по своему вкусу.
Например, когда я применил raytracer, я обнаружил, что закон обратных квадратов заставил мои точечные источники света слишком быстро падать. Я переключился на линейную модель с фиксированным напряжением (где каждый источник света имел минимальный и максимальный радиус, с линейной интерполяцией между ними), и он выглядел лучше.
Изменить: Просто нашел хороший ресурс, объясняющий это .
источник
Хорошо, я собираюсь догадаться об этом.
Предварительное наблюдение
Кривая для
c+kd+sd^2
является параболой, и кривая дляsd^2
; разница не так важна, как может показаться: они ведут себя одинаково на бесконечности, они различаются только для небольших значений. Что быk
это ни значило, оно имеет смысл только тогда, когда близко к свету.Предварительное упрощение
Поскольку это ослабление фактор вы, а могли бы установить
s == 1
, или разделить каждую константу наs
в выражении, и разделить власть вашего источника света путемs
. В формуле слишком много параметров.Вы заканчиваете с:
Смена переменных
... что строго эквивалентно:
с
A == c/s - k^2/(4s^2)
и, что более важно,D == d + k/2s
.Это
1/(A+D^2)
действительно выглядит как обычно1/(c+d^2)
, не так ли?Вывод
В
k
факторе достижении или задерживает ослабление света так , что она начинается только в радиусе-k/2s
(да, он может также иметь «негативный» радиус, думать о воображаемой точке света внутри воображаемого сферического зеркала , которое бы только пусть свет из второго раза) , Похоже, математика снова победит!Редактировать: на секунду я подумал, что это был эквивалент сферического света, но это не так. В частности, он не будет генерировать мягкие тени.
Полезность?
Я предполагаю, что этот параметр может использоваться художником, чтобы источник света выглядел так, как будто он ближе (или дальше) к объекту с точки зрения освещения, но не перемещая его. Поскольку точечные источники света создают жесткие тени, может потребоваться, чтобы источник света оставался в определенной позиции.
источник
Коэффициент линейного ослабления является физическим аналогом света, распространяющегося в среде. Без ослабления свет, кажется, движется в полной пустоте. При рендеринге «реалистичных» сцен вы хотите, чтобы воздух ослаблял интенсивность света на расстоянии, и это затухание является линейным.
источник
1/d
вR
координатах, а еще -1/d^2
в сферическихtheta
иphi
. Поэтому вы описываете1/d^3
ослабление интенсивности света.Коэффициент линейного ослабления существует для случаев, когда вы можете использовать линейное ослабление для освещения, но главное - вам не нужно его использовать (или любой другой фактор ослабления, в этом отношении).
Это позволяет вам настраивать освещение по своему вкусу. Так что просто установите любой коэффициент затухания, который вы не хотите, равным 0, и те, которые вы хотите, чтобы они отличались от 0, и все готово.
Один конкретный пример, где вы можете использовать линейное затухание, был бы, если более математически правильный обратный квадрат обеспечивает слишком быстрое падение. Используя линейный, вы можете получить результат, который может выглядеть более или менее достаточно хорошо (и с меньшим количеством источников света в сцене); так что вы бы использовали 0 константу, 1 линейную и 0 экспоненциальную.
Интересно отметить (но, по общему признанию, не относящийся к этому обсуждению), что точечные спрайты в OpenGL и D3D (и точечные параметры в OpenGL) используют одну и ту же формулу ослабления.
Также стоит отметить, что освещение OpenGL / D3D не является строго физически правильным; он никогда не был разработан, чтобы быть чем-то большим, чем приемлемое приближение, и это следует иметь в виду при запросе всего, что касается его работы.
Конечно, в настоящее время вы, скорее всего, будете использовать шейдер, поэтому старая формула освещения представляет в основном академический / исторический интерес - вы можете написать любую формулу освещения, какую захотите.
источник
c
постоянное значение ослабления для источника света.l
линейное затухание. Вот почему он умножается на расстояние до источника света.s
это квадратичное затухание, поэтому оно умножается на квадрат расстояния.В этой ссылке есть еще немного информации .
источник
Это может быть связано с тем фактом, что Z, по словам уважаемого Эрика Ленгеля ,
Глубина буфера хранит расстояния. Свет использует расстояние для затухания. Это может быть взаимосвязь между буфером глубины и реализацией освещения, которая требовала этого, хотя это применимо только в том случае, если алгоритм освещения работает в пространстве экрана, я полагаю. Помните, что лучше всегда хранить предварительно вычисленный (или рассчитанный аппаратно) обратный результат, чем выполнять деление на неразделенное значение для каждого оператора на кадр, который в этом нуждается ... и это, как правило, очень большое количество операций.
Это всего лишь предположение.
источник
Так же, как адденум: при использовании модели openGL для аппроксимации сферического источника света все три коэффициента имеют смысл и действительны (не для «предотвращения переполнения» или для «художественной свободы»):
Для сферы с радиусом r получаем:
1 / (г / г + 1) ^ 2
это переводится как
c = 1 k = 2 / r s = (1 / r ^ 2)
(см. http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).
Имхо, это приближение лучше, чем использование бесконечно малых точечных источников света без какого-либо расширения!
источник
У меня другое мнение / ответ по поводу формулы.
Например, когда мы видим точечный свет, на самом деле мы видим рассеяние света. Таким образом, формула 1 / d ^ 2 только для испускающего света этого пикселя. Но яркость в нашей камере этого пикселя будет иметь более сложную формулу, которая будет использовать теорию рассеяния света. Смотри газету
«Эпиполярная выборка для теней и сумеречных лучей в участвующих средах с однократным рассеянием»
Томас Энгельхардт, Карстен Дахсбахер Но, к сожалению, у них нет окончательной простой формулы для рассеяния света. Я думаю, возможно, конечный эффект имитации GPU будет похож на линейную и квадратичную формулу.
Вот и думаю, претензия
«если вы пытаетесь имитировать реальность, вы хотите, чтобы квадрат в квадрате (и гамма правильный)» недопустим.
На самом деле я использую формулу с линейными и квадратичными коэффициентами без гаммы, которая может очень хорошо имитировать светящиеся эффекты. Линейный не может.
Вкратце, формула имеет физический аналог рассеяния света.
источник