Войти
ПрограммированиеФорумГрафика

RIM + вектор отклонения

#0
(Правка: 5 авг. 2019, 20:38) 21:15, 25 июля 2019

Всем привет!

Есть такой шейдер:

+ Показать

Хочется найти корректный вектор отклонения от ViewDir, чтобы ореол всегда стоял по центру.
ViewDir в данном случае равен Normalize(Cam.Pos) в мировых координатах.
Но получается так:
RIM | RIM + вектор отклонения

#1
21:35, 25 июля 2019

eDmk
> ViewDir в данном случае равен Normalize(Cam.Pos) в мировых координатах.
Тебе нужен ViewDir не от камеры, а ViewDir на координаты фейса. Как-то так:

ViewDir := Cam.Pos - FacePos;
#2
(Правка: 22:02) 22:01, 25 июля 2019

MrShoor
> координаты фейса
Становится еще хуже. По краям ореола возникает «болтанка». Ореол то уже, то шире.

Код такой:

+ Показать

#3
22:37, 25 июля 2019

eDmk
> Становится еще хуже.
Да, забыл сказать, для такой нормали выкинь вот это:

v2 := Normalize(ViewDir + FaceNormal);
Оставь чисто:
rim := Pow8(1.0 - Dot(FaceNormal, ViewDir) - bias);
p.s. FaceNomral и ViewDir должен быть само собой нормализован.
p.p.s. Учитывай, что после вычитания из 1 у тебя может получится отрицательное число из-за флоатинг поинт погрешности. Лучше писать: Pow8(Max(0.0, 1.0 - Dot(FaceNormal, ViewDir) - bias));
#4
22:53, 25 июля 2019

MrShoor
> rim := Pow8(1.0 - Dot(FaceNormal, ViewDir) - bias);

может  Pow8(1.0 - Dot(FaceNormal, ViewDir)) + bias;
?

#5
23:24, 25 июля 2019

innuendo
> может Pow8(1.0 - Dot(FaceNormal, ViewDir)) + bias;
> ?
Я не знаю что это за bias, поэтому оставил его там, куда поставил его автор.

#6
23:26, 25 июля 2019

bias  - это сдвиг границы ореола. Если без bias, то его видно не будет.

#7
14:13, 26 июля 2019

eDmk
> bias  - это сдвиг границы ореола.

мы в курсе что такое bias

#8
(Правка: 20:32) 20:30, 5 авг. 2019

В общем сделал. Оказалось, что ViewDir надо в MVP-пространстве считать, а у меня ViewSpace был. Из-за этого и отклонения были. Теперь ореол четко по центру стоит.

#9
20:35, 5 авг. 2019

MrShoor
> rim := Pow8(1.0 - Dot(FaceNormal, ViewDir) - bias);
Вы были правы! ViewDir переделал в MVP-space и все случилось.
Только формула так работает:

+ Показать

Из-за того, что dot отрицательный получается.
#10
22:21, 5 авг. 2019

eDmk
> dot отрицательный получается.
ViewDir считается от фрагмента до камеры, то есть в сторону наблюдателя.

#11
23:10, 5 авг. 2019

> dot отрицательный получается.
-ViewDir

#12
8:02, 6 авг. 2019

lookid
> -ViewDir
Это софтрендер. У меня впереди +Z, а у GL впереди -Z. Это пожалуй единственное существенное отличие моего движка от GL, хотя из-за того, что проекция в GL делается после шейдеров (в нормальном мировом пространстве) - формулы совпадают. У меня проекция делается до шейдеров.

ПрограммированиеФорумГрафика