Я намагаюся створити блискучий ефект для свого шейдера в реальному часі, але не знаю як.
Ось один приклад та інший приклад .
Яку техніку я можу використати для цього?
Я намагаюся створити блискучий ефект для свого шейдера в реальному часі, але не знаю як.
Ось один приклад та інший приклад .
Яку техніку я можу використати для цього?
Відповіді:
Що ж, коли нас попросять розробити будь-який шейдер, ми повинні почати з розбиття речей на менші проблеми. І як зауважте, блискучий ефект насправді не робить шейдер добре виглядати, але загальне освітлення та ефект, використовуючи лише один з них, не виглядатимуть так добре.
Перш за все, зазначимо те, що безпосередньо не входить до шейдера:
По-друге, давайте розбимо фактичний шейдер на окремі ефекти:
Зауважте, що такі тканини мають нескінченно багато нормалів, але описана тут техніка наближається до найбільш значущої норми
Для того , щоб наблизити найбільш істотних нормальні, один з способів зробити, це використовувати координати текстури і розрахувати дотичні сітки, а замість обчислення N . L ви обчислите 1- (NT).
Повне пояснення тут . І вам, мабуть, потрібно реалізувати це в фрагменті шейдера, а не вершинній техніці, про яку вони говорять. Також можуть застосовуватися інші анізотропні моделі.
Тепер для блискучого ефекту:
Це можна зробити у просторі світу / місцевому просторі текстури або просторі екрану як окремий пропуск.
Алгоритм, який я можу придумати, використовує техніку обробки зображень (якщо припустити, що сітка має текстурні координати).
Зверніть увагу, що наведене вище зображення є лише прикладом максимального фільтра, і застосувавши його до шуму, ви отримаєте щось подібне до зіркового поля.
Приклад фільтра Гаусса, застосованого на максимальному (ед) шумі.
Зауважте, що ця методика може потребувати значної оптимізації для роботи в режимі реального часу.
Є цікава стаття AMD - Отримання процедур .
Здається, блискітки важче, ніж я думаю.
Гідне рішення: Використовуйте 3D-позицію для індексації функції 3D-шуму, додайте вектор перегляду, використовуйте функцію frac для подальшої рандомізації речей.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);