Вершинний освітлення спільно з lightmaps

Зараз вже нікого не здивуєш наявністю LightMap'ов в програмі. І вже тим більше наявністю вершинного освітлення. Але при всьому при цьому не треба відразу викидати дану тему на смітник.

Раніше вершинний освітлення не могло давати якісних результатів через те, що карти не могли малювати достатню кількість трикутників на кадр, при яких вершинний освітлення мало б силу. Тому і виходило щось типу того:

Вершинний освітлення спільно з lightmaps

На лівій частині картинки видно, що через малу кількість трикутників освітлення не виходить таким, як на правій частині. Тобто, не видно світлового плями, а видно лише плавні переходи кольорів між кожною вершиною, а їх всього чотири. Щоб домогтися такого ж якості світла як на правій частині картинки, потрібно використовувати або LightMap'и або більш високу кількість трикутників.

Тепер спробуємо порівняти обидва методи.

Висновок: LightMap - якість, VertexLight - кількість.

Зазвичай людей більше цікавить якість. Краще один хороший процесор, ніж десять 486'их. В крайньому випадку, якщо буде попит на 486'ие процесори, то налагодять їх виробництво.

Ось картинка з прикладу, що додається до цієї статті:

Вершинний освітлення спільно з lightmaps

На зображенні намальований чайник, який відкидає тінь на сцену. При цьому світло не проходить через нього. Зауважте, що тінь намальована досить якісно і найголовніше - це не LightMap'и. Це і є те саме вершинний освітлення.

Кількість полігонів на чайнику досить висока і тільки тому тінь на ньому виглядає непогано.

Висновок: при використанні високополігональні об'єктів краще використовувати вершинний освітлення. При цьому LightMap'и використовувати як спосіб створення якісних тіней.

Тепер більш детально розберемо найголовнішу функцію в цьому прикладі:

Справа вся в тому, що програма настільки проста, що навіть кількість об'єктів в ній фіксоване. Тобто при спробі підмінити файли карт, програма, швидше за все не запуститься, а якщо і будуть працювати, то тільки перші два об'єкти. У вас, швидше за все, власні класи векторів, площин, тому я не став робити з прикладу супер накручену програму, в якій чорт ногу зломить. Думаю замінити один тип даних на інший не складе труднощів.

Тому в функції InitVertexLight () ми відразу пробігає по кожній вершині другого об'єкта. А далі алгоритм такий:

1. Ставимо колір тіні в 130. Взагалі це можна робити і більш просунутими методами, але і цей згодиться.

2. Так як джерело світла всього один, то перевіряємо відразу його. Якщо відстань від лампочки більше радіуса освітлення, то пропускаємо вершину. Хоча і в даному прикладі це не видно з-за маленької сцени, але все-таки краще не пропускати вершину, а призначити їй колір. Чорний або сірий.

3. Знаходимо факт про перетин променя від джерела світла до вершини.

4. Далі знову знаходимо відстань від лампочки до вершини. Для оптимізації можна робити лише один раз.

Далі за формулами, які не раз згадувалися на багатьох сайтах, знаходимо колір в вершині виходячи з довжини і радіусу. Робимо це так:

- Знаходимо відстань від джерела світла до вершини

- Отримуємо значення attenuation (a) за формулою: 1 - (d / rad)
де,
d - відстань від джерела світла до вершини,
rad - радіус джерела світла (радіус освітлення)

- Потім знаходимо RGB вершини за формулою: Color * a * b (знаходиться для кожної RGB складової)
де,
Color - колір джерела світла (R, G або B)
a - attenuation
b - brightness
Але в нашому прикладі параметр brightness ми опустили.

5. Перевіряємо щоб числа не повилазили за межі і присвоюємо їх кольором вершині.

Фішка в тому, що колірні параметри LightMap'а повинні збігатися з вершинним кольором, так як в противному випадку можна побачити різницю між двома методами, різницю в кольорі. А це може погано позначитися на зображенні в сторону "глюкавий". Хоча іноді можна і не стежити за схожістю колірних параметрів іншого освітлення. Наприклад, у нас є стіна, а в ній проходять труби, їх, зрозуміло, видно. Так ось, можна надати трубах додатковий вид якщо використовувати на них вершинний освітлення, а так як труби знаходяться в стіні, їх підсвічування не зачепить загальний колір стіни. Я все це до того, що вершинний освітлення і LightMap'и не зовсім схожі в кінцевому результаті, тому потрібно стежити, щоб різні об'єкти знаходяться під одним лампою були освітлені однаково, як LightMap'амі, так і вершинним освітленням.

Схожі статті