ПредишенСледващото

Вероятно всеки е чувал за осветление модели, те са навсякъде около нас: например, да вземе всеки обект, една и съща чаша състояние на масата. Тя пада светлина върху по-точно, ако светлината от слънцето или друг източник на светлина се нарича модел покритие. На практика никой не се опитва да програмирате всички физически принципи на светлина, тъй като изчисляването им е много скъпо. Въпреки това, изобретил много модели дават реалистични резултати с малки изчисления.

Помислете за всички детайли, ние ще създадем един прост модел на светлината - дори и светлина.

1. Единна осветление.

Uniform осветление (околно осветление) осигурява постоянна първоначална осветление за цялата сцена. Тя обхваща всички върховете на предмети по равно, защото те не зависят от всеки друг фактори осветление. Това е най-бързият и най-лесният вид осветление, но дава малко реалистичен резултат. Формулата за изчисляване на модела на осветление също е много проста, тъй като има само една аритметична операция - умножение. За да се изчисли, че е достатъчно, за да се размножават цвета на материала за светлината.

Vertex Shader да се изчисли единни модели на осветеност:

Тази проста шейдър просто изчислява положението на обект в пространството, но в този модел е възможно да се запали и да не се използва, тъй като от върха на които ние не разполагаме с други компоненти (нормални и т.н.), за да се изчисли.

Тук също няма нищо сложно, просто върнете продукта на вектор съставител на това, което този номер в този случай ambient_intensity. Прави го по този начин:

униформа осветление на модела:

Shader Програмиране hlsl

За да се изчисли отблясъци и дифузна светлина компоненти, трябва да намерите основните елементи:
• Нормалната N към фрагмента.
• видове вектори V - вектор, който е насочен към наблюдателя.
• Позицията на светлинния източник L.

Shader Програмиране hlsl

Ъглите между тези вектори представляват интензитета на светлината.

2. дифузно модел осветление.

Дифузната модел осветление (дифузно модел осветление) - осветление модел, което зависи от източника на светлина и на позицията на повърхността на обект нормално. Тъй като светлинна емисия е еднакво във всички посоки, вид вектор не е от значение, т.е. V = 0. Такъв метод изисква повече изчисления са се променили за всеки връх на обекта, но добре скрива обекти и им дава сила на звука. Светлината пада, без да попълвате по цялата повърхност на един и същи цвят (както е в случая на ranomernym осветление) и създава впечатление, че светлината е насочена към това, което някога повърхност.

Shader Програмиране hlsl

Ако позицията вектор на източника на светлина е перпендикулярна на повърхността, не се наблюдава никакво помътняване, защото интензивността на светлината зависи от ъгъла # 945;. Формула (в съответствие със закона на Ламберт) се използва за изчисляване на дифузно осветление модел:

За да обобщим - създаване шейдъри за осветление изчисления.

На пиксели:

Дифузно осветление модел:

3.Blikovaya модел осветление.

Трудно е да си представим такъв модел на осветление не се виждаш с нея. И всъщност този модел, можем да видим почти навсякъде. Например, чист полиран (кръгови движения) повърхност директно метал, като го светлинен източник и търси в някакъв ъгъл, който не е перпендикулярна на повърхността. В резултат на това ще видим блясъка на повърхността, което значително да увеличи реализма на изображението. Тези разсъждения са отражение на източника на светлина от повърхността. В този модел, в допълнение към осветлението на вектора на светлинен източник и нормално положение (както е в случая с дифузно модел осветление) още две вектор: векторни видове и вектора на отражение. Specular осветление модел (огледален модел осветление), предложен Bui-Туонг Фонг.

Shader Програмиране hlsl

Ъгълът между вектора и отражение вектор видове - # 946;. По-голямата ъгълът # 946;, толкова по-ярко осветление отблясъци. Ето защо, огледален модел осветление се изчислява по следната формула:

където R = отразява (-norm (V), N)
п - коефициент на яркост.

Зависимостта на яркостта на ъгъла # 946;:

С п отражение на параметър растеж става все огледален и по-концентриран по посока на отражение вектор R. на

По желание се изчисли специфичен вектор в Shader, може да се изчисли в програмата и се въвеждат в Shader на върха. За да направите това, трябва да се обърнете матрицата и видовете, умножени по вектор D3DXVECTOR4 на (0.0,0.0,0.0,1.0) - позицията, в която векторът е перпендикулярна на повърхността (гледане на нас). Тя изглежда така:

Specular модел осветление:

Shader Програмиране hlsl

Модификация огледален осветление на палачинки.

Джим Blinn излезе с алтернативен метод за изчисляване на огледален осветление, което елиминира скъпи изчисляване на вектора на размисъл. Той въвежда междинен вектор, който е средната стойност между специфичен вектор и позицията на светлинния източник: Н = (L + V) / (| L + V |)

Общата формула е:

Ето защо, Shader на фрагмент трябва да е това:

Ускорение изчисляване на яркостта.

Шлик предложи смяна степен п. Да предположим, че скаларен продукт е D: D = (N • Н) п. след това от неговия метод на яркост се изчислява, както следва:

Сравнителни графики на закони мощност:

В действителност, физическия смисъл на огледално отражение светлина е много по-сложен, отколкото се предполага в осветление модел Фонг. В по-реалистична модел зависи от L на вълната и ъгълът на падане (N • L). Тази зависимост се нарича коефициент на Френел.

Комбинирането на осветителни компоненти.

Сега можем да добавите до три схеми на осветление (непрекъснат, дифузни и огледален), за да се получи общата сума на светлината I, в резултат на окото:

Pixel Shader сега ще бъде, както следва:

Реалистично осветление на базата на Кук-Торънс

В по-реалистични модели на осветление се фокусира върху разпределението на падащата светлина енергия. Част от него се абсорбира от материала и се превръща в топлина, а друга част е разпръснат като дифузна светлина, и третата част определя осветлението на огледален повърхност. Ето защо, за отделяне на различни материали от падащата светлина е различна и зависи от:
• нормалните функции за дистрибуция
• засенчване и скрининг
• Фактор на Френел

функция нормално разпределение

Тази функция се описва възможно отклонение на нормалата към повърхността от идеалния нормална N. В по-плитки функцията, толкова по-големи отклонения са приемливи и по-голяма е стойността на мястото на отразената отблясъци. Необходими са разположени по протежение на нормален вектор на L + V и се вижда в посока V и са под ъгъл (H • N) на зрителя. Cook и Torrance използва Бекманово разпределение формула:

където г = Н • N
m - степен на грапавост на обекта. 0.2f - гладка повърхност, 0.6f - груб. По подразбиране е 0.3f.

разпределение График Бекман:

Shader Програмиране hlsl

Засенчване и скрининг

В модела на Cook-Torrance също отчита ефекти като засенчване (затъмнение) и екраниране (маскиране), които определят интензивността на компонент огледален.

Unshielded светлина е:

Незакрита светлина е:

Тогава последният фактор G е равна на:

Това съотношение се определя количеството на отразената светлина и се определя от функцията:

където е - ъгъл на падане, косинус, което е равно на С = (N • Н)
п - пречупване индекс на материала, G = SQRT (п + 2 в 2 1)

В действителност, в Shader, ние ще използваме различна формула за изчисляване на коефициента на ограничени инструкциите на Френел. Шлик предложи замяна:

F = Rs + (1-R) ​​х (1- E • N) п
където Rs - огледално отражение,
Е - вектор на наблюдателя,
N - нормално от нормалното картата.

Това приближение игнорира съответно и F н компоненти, но има наш степен, с увеличение, което не е лошо резултати могат да бъдат постигнати. Schlick използва п = 5.

Комбинацията от всички фактори

Torrence и Sparrow комбинира тези фактори и производни на формула за изчисляване на светлината огледален:

Знаменателя N • V въведен за регулиране на интензитета на светлината.

Shader Програмиране hlsl

Общата формула за изчисляване на количеството светлина, е следното:

Имах малко да се опрости формула както и първоначалното осветление всеки компонент (с изключение на огледален), умножено също в F (0, п). Това се постига чрез използването на сближаване Шлик е.

Pixel Shader този ефект:

Подкрепете проекта - споделете линка, благодаря!