Що таке затінення рампи або освітлення і як це працює? Чи відрізняється він від затінення тонів або це одне і те ж поняття? Як по-різному обчислюється окулярність для затінення рампи проти блін-фонга чи ламберта?
Що таке затінення рампи або освітлення і як це працює? Чи відрізняється він від затінення тонів або це одне і те ж поняття? Як по-різному обчислюється окулярність для затінення рампи проти блін-фонга чи ламберта?
Відповіді:
У традиційному затіненні Бліна / Фонга ви обчислюєте дифузний термін для пікселя, вимірюючи косинус кута між нормальним на поверхні та напрямком світла. Отже, у цьому випадку простий шейдер виглядатиме приблизно так:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
У затіненні рампи ідея полягає в модулюванні коефіцієнта розсіювання за допомогою 1D текстури пошуку. Залежно від того, що ви вкладаєте в цю текстуру, ви можете створювати різні ефекти. Отже, наша шейдерна функція для обчислення дифузного коефіцієнта стає:
texture1D rampTex;
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
// Map value from [-1, 1] to [0, 1]
float rampCoord = Dot(lightDir, normal) * 0.5 + 0.5;
return tex1D(rampTex, rampCoord);
}
Наприклад, якщо ми хотіли реалізувати шейдер для комірок, то, що ми могли б зробити, це генерувати текстуру рампи, яка імітує ступінчату функцію:
Можна використовувати одну і ту ж ідею для створення різних ефектів і для дзеркального освітлення. Затінення "Ramp" насправді стосується лише ідеї модулювання значення затінення текстурою.
РЕДАКТУВАННЯ : Team Fortress 2 використовує шейдер для пандусів у візуалізації. Ви можете ознайомитися з деталями у цьому документі:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
Дивіться під Розділом 5, у підрозділі під назвою "Функція дифузної деформації"