Я пытаюсь создать блестящий эффект для моего шейдера в реальном времени, но я не знаю как.
Вот один пример и другой пример .
Какой метод я могу использовать для реализации этого?
Я пытаюсь создать блестящий эффект для моего шейдера в реальном времени, но я не знаю как.
Вот один пример и другой пример .
Какой метод я могу использовать для реализации этого?
Ответы:
Что ж, когда нас попросят спроектировать любой шейдер, мы должны начать с разбивки на мелкие проблемы. И, как вы заметили, эффект сверкания на самом деле не делает шейдер хорошо выглядящим, но общее освещение и эффект при использовании только одного из них не будут выглядеть так же хорошо.
Прежде всего, давайте заявим, что не является частью шейдера:
Во-вторых, давайте разберем настоящий шейдер на отдельные эффекты:
Обратите внимание, что такие ткани имеют бесконечно много нормалей, но методика, описанная здесь, приближается к наиболее значимым нормам
Для того , чтобы приблизить наиболее существенных нормальные, один из способов сделать, это использовать координаты текстуры и рассчитать касательные сетки, а вместо вычисления N . L вы рассчитываете 1- (NT).
Полное объяснение здесь . И вам, вероятно, нужно реализовать это в фрагментном шейдере, а не в технике вершин, о которой они говорят. Другие анизотропные модели также могут применяться.
Теперь о блестящем эффекте:
Это можно сделать в мировом пространстве / локальном текстурном пространстве или на экране экрана в качестве отдельного прохода.
Алгоритм, который я могу придумать, использует технику обработки изображений (при условии, что сетка имеет текстурные координаты).
Обратите внимание, что приведенное выше изображение является просто примером фильтра max, и применение его к шуму даст что-то похожее на звездное поле.
Пример фильтра Гаузиана, применяемого к максимальному (ed) шуму.
Обратите внимание, что этот метод может потребовать значительной оптимизации для шейдеров реального времени.
Есть интересная статья AMD - Начало процедурного .
Кажется, что блестки сложнее, чем я думаю.
Достойное решение: используйте трехмерное положение для индексации функции трехмерного шума, добавьте вектор вида, используйте функцию ГРП для дальнейшей рандомизации.
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);