Чи має компонент лінійного загасання в моделях освітлення фізичний аналог?


18

У OpenGL (та інших системах) коефіцієнт ослаблення відстані для точкових вогнів є чимось подібним 1/(c+kd+sd^2), де dвідстань від світла і c, kі sє константами.

Я розумію sd^2компонент, який моделює добре відомий фізично точний ослаблення закону зворотного квадрата, який очікується насправді.

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

Яку роль відіграє лінійний kdкомпонент у моделі ((за замовчуванням kу OpenGL це нуль). Коли ви б використали інші значення для k? Я знаю, що це називається компонентом "лінійного загасання", але яку поведінку він моделює в моделі освітлення? Здається, це не з'являється в жодній фізичній моделі світла, про яку я знаю.

[EDIT]

Девід Гувейя вказував, що лінійний фактор може бути використаний для того, щоб зробити сцену «ближче» до того, що планував розробник / художник, або щоб краще контролювати швидкість, з якою падає світло. У такому випадку моє запитання стає "чи має коефіцієнт лінійного ослаблення аналог фізики чи він просто використовується як фактор випромінювання для контролю якості світла в сцені?"


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

Вибачте, Девіде, я не хотів неправильно представити вашу відповідь. Я змінив свою редакцію вище.
Кен

1
Завжди добре пам’ятати, що все освітлення - хак, чисто і просто =)
Патрік Хьюз

Відповіді:


21

Світло від точкових джерел падає з квадратом відстані. Це фізична реальність.

Лінійне ослаблення часто констатується як вищий. Але це справедливо лише під час роботи в нелінійному кольоровому просторі. Тобто, якщо у вас немає активної корекції гамми. Причина досить проста.

Якщо ви записуєте лінійні значення RGB на нелінійний дисплей без корекції гамми, то ваші лінійні значення будуть керуватися вбудованим гамма-рампом монітора. Це ефективно затемнює сцену порівняно з тим, що ви насправді задумали.

Припускаючи гаму 2,2, ваш монітор ефективно підніме всі кольори до потужності 2,2 під час їх відображення.

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

Але фактичний зворотний квадрат: 1/sd^2стає: 1/((s^2)(d^4.4)). Це змушує загасання світла падати набагато різкіше, ніж очікувалося.

Загалом, якщо ви використовуєте правильну гамма-корекцію (наприклад, надання візуалізації на sRGB framebuffer), вам не слід використовувати лінійне ослаблення. Це не буде виглядати правильно. Зовсім . І якщо ви не використовуєте корекцію гамми ... що з вами не так;)

У будь-якому випадку, якщо ви намагаєтесь наслідувати реальність, ви хочете обернути квадрат (і гамма правильно). Якщо ви цього не зробите, то можете робити все, що потрібно для своєї сцени.


4
+1 Я знав про правильне відображення гамми деякий час. Я знав про квадратичне та лінійне ослаблення деякий час. І це той момент, коли я вперше усвідомлюю зв’язок між ними. :-)
Девід Гувейя

Будь-яка причина для -1?
Ніколь Болас

9

Гнучкість .

Тому що ви можете хотіти, щоб ваші ліхтарі випадали лінійно. Це там, щоб дати вам такий ступінь контролю. Це насправді не повинно бути фізично точним (і цілі рівняння освітлення затінення фоном, звичайно, також фізично не точні).

Іноді квадратична модель занадто швидко випромінює світло біля джерела і залишатиме «білі відблиски» на сусідніх поверхнях. Забезпечивши лінійний та постійний коефіцієнти, ви маєте можливість регулювати результати на свій смак

Наприклад, коли я реалізував лучник, я виявив, що закон зворотного квадрата змусив мої точкові світильники занадто швидко падати. Я перейшов на затиснуту лінійну модель (де кожен світло мав мінімальний і максимальний радіус, з лінійною інтерполяцією між ними), і це просто виглядало краще.

Редагувати: Просто знайшов приємний ресурс, що пояснює це .


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ослаблення інтенсивності світла.
sam hocevar

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? У початковій статті сказано лише "Переглянувши результати низки тестів, це стало очевидним", що недостатньо переконливо з точки зору питання про фізичне моделювання.
користувач1914692

0

У мене інший погляд / відповідь щодо формули.

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

"Епіполярний відбір зразків для тіней і крепускулярних променів у задіяних середовищах з одинарним розсіюванням"

by Thomas Engelhardt, Carsten Dachsbacher Але, на жаль, у них немає остаточної простої формули для розсіювання світла. Я думаю, можливо, остаточний ефект імітації GPU був би подібний до лінійної та квадратичної формули.

Тому я вважаю, що претензія:

"якщо ви намагаєтесь імітувати реальність, ви хочете, щоб обернено-квадратний (і гамма правильний)" недійсний.

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

У короткому резюме формула має фізичний аналог розсіювання світла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.