Имеет ли компонент линейного ослабления в моделях освещения физический аналог?


18

В OpenGL (и других систем) коэффициент затухания расстояния для точечных ламп является то , как 1/(c+kd+sd^2), где dрасстояние от света и c, kи sявляются константами.

Я понимаю sd^2компонент, который моделирует хорошо известное физически точное затухание в "законе обратных квадратов", ожидаемое в реальности.

Я предполагаю, что константа c, обычно одна, предназначена для очень маленьких значений d(и, возможно, для деления на ноль защиты?).

Какую роль играет линейный kdкомпонент в модели (по умолчанию kв OpenGL ноль). Когда бы вы использовали другие значения для k? Я знаю, что это называется компонентом «линейное затухание», но какое поведение он моделирует в модели освещения? Кажется, это не проявляется ни в одной физической модели света, о которой я знаю.

[РЕДАКТИРОВАТЬ]

Дэвид Гувейя отметил, что линейный фактор может быть использован для того, чтобы «приблизить» сцену к тому, что задумал разработчик / художник, или чтобы лучше контролировать скорость, с которой свет падает. В этом случае мой вопрос звучит так: «Есть ли у линейного коэффициента ослабления физический аналог или он просто используется как фактор выдумки, чтобы помочь контролировать качество света в сцене?»


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

Извините, Дэвид, я не хотел искажать ваш ответ. Я изменил мою правку выше.
Кен,

1
Всегда приятно помнить, что все освещение взломано, чисто и просто =)
Патрик Хьюз

Ответы:


21

Свет от точечных источников падает с квадратом расстояния. Это физическая реальность.

Линейное затухание часто считается превосходящим. Но это верно только при работе в нелинейном цветовом пространстве. То есть, если у вас нет активной гамма-коррекции. Причина довольно проста.

Если вы записываете линейные значения RGB на нелинейный дисплей без гамма-коррекции, то ваши линейные значения будут искажены встроенной гамма-шкалой монитора. Это эффективно затемняет сцену по сравнению с тем, что вы на самом деле намеревались.

Принимая гамму 2,2, ваш монитор будет эффективно повышать все цвета до уровня 2,2 при отображении.

Это линейное затухание 1/kd. Это линейное затухание гаммы рампы монитора применяется: 1/(kd)^2.2. Это довольно близко к правильным отношениям в обратном квадрате.

Но фактический обратный квадрат: 1/sd^2становится: 1/((s^2)(d^4.4)). Это заставляет ослабление света падать намного резче, чем ожидалось.

В общем, если вы используете правильную гамма-коррекцию (например, рендеринг в кадровый буфер sRGB), вы не должны использовать линейное затухание. Это не будет выглядеть правильно. На все . И если вы не используете гамма-коррекцию ... что с вами не так;)

В любом случае, если вы пытаетесь имитировать реальность, вам нужен обратный квадрат (и гамма правильная). Если нет, то вы можете делать все, что вам нужно для вашей сцены.


4
+1 Я давно знал о правильном рендеринге гаммы. Я знал о квадратичном и линейном затухании некоторое время. И это тот момент, когда я впервые осознаю связь между ними. :-)
Дэвид Гувея

Любая причина для -1?
Николь Болас

9

Гибкость .

Потому что вы можете захотеть, чтобы ваши огни погасли линейно. Это там, чтобы дать вам такую ​​степень контроля. Это не обязательно должно быть физически точным (и все уравнения освещения затенения фонга также, конечно, не являются физически точными).

Иногда квадратичная модель слишком быстро излучает свет около источника и оставляет «белые блики» на близлежащих поверхностях. Предоставляя линейные и постоянные коэффициенты, вы можете настраивать результаты по своему вкусу.

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

Изменить: Просто нашел хороший ресурс, объясняющий это .


6

Хорошо, я собираюсь догадаться об этом.

Предварительное наблюдение

В OpenGL (и других систем) коэффициент затухания расстояния для точечных ламп является то , как 1/(c+kd+sd^2), где dрасстояние от света и c, kи sявляются константами.

Я понимаю sd^2компонент, который моделирует хорошо известное физически точное затухание в "законе обратных квадратов", ожидаемое в реальности.

Кривая для c+kd+sd^2является параболой, и кривая для sd^2; разница не так важна, как может показаться: они ведут себя одинаково на бесконечности, они различаются только для небольших значений. Что бы kэто ни значило, оно имеет смысл только тогда, когда близко к свету.

Предварительное упрощение

Поскольку это ослабление фактор вы, а могли бы установить s == 1, или разделить каждую константу на sв выражении, и разделить власть вашего источника света путем s. В формуле слишком много параметров.

Вы заканчиваете с:

1/(c/s+(k/s)d+d^2)

Смена переменных

... что строго эквивалентно:

1/(A + D^2)

с A == c/s - k^2/(4s^2)и, что более важно, D == d + k/2s.

Это 1/(A+D^2)действительно выглядит как обычно 1/(c+d^2), не так ли?

Вывод

В kфакторе достижении или задерживает ослабление света так , что она начинается только в радиусе-k/2s (да, он может также иметь «негативный» радиус, думать о воображаемой точке света внутри воображаемого сферического зеркала , которое бы только пусть свет из второго раза) , Похоже, математика снова победит!

Редактировать: на секунду я подумал, что это был эквивалент сферического света, но это не так. В частности, он не будет генерировать мягкие тени.

Полезность?

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


3

Коэффициент линейного ослабления является физическим аналогом света, распространяющегося в среде. Без ослабления свет, кажется, движется в полной пустоте. При рендеринге «реалистичных» сцен вы хотите, чтобы воздух ослаблял интенсивность света на расстоянии, и это затухание является линейным.


Я не думаю, что это может быть правдой. Свет, проходящий через среду, будет ослабляться 1/dв Rкоординатах, а еще - 1/d^2в сферических thetaи phi. Поэтому вы описываете 1/d^3ослабление интенсивности света.
Сэм Хочевар

3

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

Это позволяет вам настраивать освещение по своему вкусу. Так что просто установите любой коэффициент затухания, который вы не хотите, равным 0, и те, которые вы хотите, чтобы они отличались от 0, и все готово.

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

Интересно отметить (но, по общему признанию, не относящийся к этому обсуждению), что точечные спрайты в OpenGL и D3D (и точечные параметры в OpenGL) используют одну и ту же формулу ослабления.

Также стоит отметить, что освещение OpenGL / D3D не является строго физически правильным; он никогда не был разработан, чтобы быть чем-то большим, чем приемлемое приближение, и это следует иметь в виду при запросе всего, что касается его работы.

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


1
  • c постоянное значение ослабления для источника света.
  • lлинейное затухание. Вот почему он умножается на расстояние до источника света.
  • s это квадратичное затухание, поэтому оно умножается на квадрат расстояния.

В этой ссылке есть еще немного информации .


Спасибо, но мой вопрос в том, какова роль линейного компонента ослабления в моделировании света. Я спрашиваю, потому что это не появляется ни в одной физической модели света, о которой я знаю. Предоставленная вами ссылка НЕ ​​объясняет, для чего предназначен компонент линейного ослабления. Это просто говорит; «Это линейное затухание», без каких-либо других объяснений.
Кен,

Хорошо, я неверно истолковал ваш вопрос. Линейное затухание было бы лучше наблюдать в бесконечном одномерном источнике света (например, флуоресцентной лампе), в то время как квадратичное моделирование поведения сферического источника света. До сих пор я нашел только одно место, где есть объяснение соответствия между физической моделью освещения и моделью, используемой в компьютерной графике: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo

1

Это может быть связано с тем фактом, что Z, по словам уважаемого Эрика Ленгеля ,

является нелинейным, поскольку корректная в перспективе растеризация требует линейной интерполяции 1 / z - линейная интерполяция самой z не дает правильных результатов. Аппаратное обеспечение должно вычислять 1 / z в каждой вершине и интерполировать его по треугольнику, поэтому удобно просто записать это значение в буфер глубины вместо выполнения дорогостоящего деления каждого пикселя для восстановления z.

Тот факт, что вы получаете больше точности z ближе к ближней плоскости, является лишь побочным эффектом и не имеет ничего общего с мотивацией позади 1 / z-интерполяции.

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

Это всего лишь предположение.


Вы можете быть на что-то там. Это может иметь отношение к пространству, в котором рассчитывается освещение. Но я не думаю, что буфер глубины является его частью, поскольку он хранит «псевдорасстояние» от глаза (или передней плоскости) до объекта, а не расстояние от источника света до объекта. Это расстояние света, которое используется в освещении.
Кен

@ downvoter - хотите прокомментировать или просто троллинг? (цитирую Джонатана)
инженер

Также при понижении голоса затухание рассчитывается в пространстве глаз, а не в нормированном пространстве -> перспектива / z не имеет к этому никакого отношения
Оливер Зендель,

1

Так же, как адденум: при использовании модели 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 / r + 1) ^ 2? В оригинальной статье говорится только: «После просмотра результатов серии испытаний она стала очевидной», что недостаточно убедительно с точки зрения вопроса о физическом моделировании.
user1914692

0

У меня другое мнение / ответ по поводу формулы.

Например, когда мы видим точечный свет, на самом деле мы видим рассеяние света. Таким образом, формула 1 / d ^ 2 только для испускающего света этого пикселя. Но яркость в нашей камере этого пикселя будет иметь более сложную формулу, которая будет использовать теорию рассеяния света. Смотри газету

«Эпиполярная выборка для теней и сумеречных лучей в участвующих средах с однократным рассеянием»

Томас Энгельхардт, Карстен Дахсбахер Но, к сожалению, у них нет окончательной простой формулы для рассеяния света. Я думаю, возможно, конечный эффект имитации GPU будет похож на линейную и квадратичную формулу.

Вот и думаю, претензия

«если вы пытаетесь имитировать реальность, вы хотите, чтобы квадрат в квадрате (и гамма правильный)» недопустим.

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

Вкратце, формула имеет физический аналог рассеяния света.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.