Для некоторых типов шейдеров необходимо использовать вектор dPdu (его ещё называют tangent).
В частности без этого вектора нельзя сделать анизотропное освещение.
Теперь проблема:
на польгональных моделях dPdu получается дискретным (при сферическом или боксовом UVMap-е) и совершенно ужасным (случайные вектора) при использовании кастомного UV.
При использовании NURBS - tangent нормально интерполируется.
Каким образом получить полигональную модель (с кастомными текстурными координатами) у которой tangent вектор будет гладким???
ЗЫ. Я приблезительно понимаю почему проблема возникает: dPdu - это производная по параметру меша модели. Если это простая полигональная модель (не параметрическая как NURBS) - то в качестве параметров берутся u == s и v == t (тоесть текстурные координаты).
ЗЫЫ. Я написал простой шейдер чтоб проилюстрировать проблему:
surface tangent()
{
Ci = color(normalize(dPdu));
Oi = Os;
}
Рендер двух торов (Polygons и NURBS) в атаче
В частности без этого вектора нельзя сделать анизотропное освещение.
Теперь проблема:
на польгональных моделях dPdu получается дискретным (при сферическом или боксовом UVMap-е) и совершенно ужасным (случайные вектора) при использовании кастомного UV.
При использовании NURBS - tangent нормально интерполируется.
Каким образом получить полигональную модель (с кастомными текстурными координатами) у которой tangent вектор будет гладким???
ЗЫ. Я приблезительно понимаю почему проблема возникает: dPdu - это производная по параметру меша модели. Если это простая полигональная модель (не параметрическая как NURBS) - то в качестве параметров берутся u == s и v == t (тоесть текстурные координаты).
ЗЫЫ. Я написал простой шейдер чтоб проилюстрировать проблему:
surface tangent()
{
Ci = color(normalize(dPdu));
Oi = Os;
}
Рендер двух торов (Polygons и NURBS) в атаче
Вложения
-
43,7 КБ Просмотров: 399