RVMAT: Функция Френеля и specularPower или как добиться нормального визуала для материала
Спешу поделиться новостью: я чертовски внимательный и курю мануалы как боженька (нет).
В связи с этим решил накатать пост, дабы поделиться откровением.
Вот по-любому многие сталкивались с ситуацией, что ебешься с предметом, ебешься, а довести его внешний вид до ума не получается. Пластик не выглядит как пластик, металл не металл, дерево не дерево, бетон не бетон и как не крутишь smdi, specular, а все равно какая-то хрень. Не выходит каменный цветок и все тут.
Подставляешь значения для Френеля из ванильных материалов, но и тут что-то идет не так. И что с этим делать - не понятно. По крайней мере - это моя стандартная история, с которой я воевал довольно долго. Что ж, решение для себя я нашел, хоть и гораздо позже, чем хотелось бы. А все дело в том, что внимательней надо просматривать мануалы.
Так вот.
Все дело в блике и отражении на поверхности. В том, какие они, как выглядят. Как преломляется свет и как рассеивается.
За сам блик у нас отвечает specularPower. Чем больше значение, тем больше блик.
За отражения и шероховатости, где их больше, где меньше - specular и карта smdi.
А вот функция Френеля как раз отвечает за то, каким именно будет блик на поверхности. Как будет рассеиваться и преломляться свет. Вроде ничего нового, но остается вопрос: как понять, каким будет этот блик при тех или иных значениях в функции? Лично мне для понимания процесса очень не хватало наглядности. Что ж, решение найдено и оно лежало перед носом.
Открываем TexView, идем в File => Generate...
Это окно для генерации процедурных текстур.
Содержимое окна заменяем на
N = 0.969770;
K = 0.0118000;
X = u * 0.5 + 0.5;
S = acos(X);
AA = sqrt((sqrt((N^2-K^2-sin(S)^2)^2 + 4*N^2*K^2)+(N^2-K^2-sin(S)^2))/2);
BB = sqrt((sqrt((N^2-K^2-sin(S)^2)^2 + 4*N^2*K^2)-(N^2-K^2-sin(S)^2))/2);
FS = (AA^2+BB^2-2*AA*cos(S) + cos(S)^2)/(AA^2+BB^2+2*AA*cos(S) + cos(S)^2);
FP = FS*(AA^2+BB^2-2*AA*sin(S)*tan(S)+sin(S)^2*tan(S)^2)/(AA^2+BB^2+2*AA*sin(S)*tan(S)+sin(S)^2*tan(S)^2);
r=1;
g=1;
b=1;
a=(FS+FP)/2;
Жмем apply. Вуаля, визуализация блика
Давайте разбираться, что есть что.
Для этого посмотрим на 6 стейдж в материале с супер шейдером.
texture = "#(ai,128,128,1)fresnel(N,K)";
128 и 128 - размер текстуры в пикселях, которая будет сгенерирована процедурно (она и будет являться нашим бликом).
N и K - значения для функции. И эти же значения есть в формуле выше.
Т.е. мы просто заменяем в TexView значения для этих переменных на свои, тыкаем apply, смотрим что из этого получилось.
Для наглядности в некоторых моментах удобно значение для r оставлять единицей, а для g и b ставить 0.
Может быть с первого раза будет не очень понятно, но чуть-чуть экспериментов и все встанет на свои места.
Эта штука серьезно упростила мне жизнь
полезное