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

Как расчитать правильный Tangent Space? (комментарии) (3 стр)

Страницы: 1 2 3 4 5 Следующая »
#30
15:03, 9 сен 2013

Проясните вопрос про tangent space. Много всякого перечитал, как рассчитывать более-менее научился, crytek-ую штуку нашёл.
Но есть одна неясность.

Вот я закидываю в движок обычный куб в obj-формате.
У него есть восемь вершин.
v -3.400144 -3.641700 3.400144
v 3.400144 -3.641700 3.400144
v -3.400144 3.641700 3.400144
v 3.400144 3.641700 3.400144
v -3.400144 3.641700 -3.400144
v 3.400144 3.641700 -3.400144
v -3.400144 -3.641700 -3.400144
v 3.400144 -3.641700 -3.400144

При этом 24 нормали и сколько-то текстурных координат.
Когда я собираю это всё в вертексы, у меня получается не 8 вершин, а больше, потому что могут для одной вершины по позиции отличаться текстурные координаты, насчёт нормалей пока не смотрел.
Когда я собираю массив vertices на вывод, куб переходит уже где-то 13 или 14 вертексов, при этом получаются пары с одинаковой позицией (допустим, вершина входит в треугольник одной грани с одними текстурными координатами и в треугольник другой грани с другими текстурными координатами).

Как мне проводить расчёт tangent-space?
Для 8 вершин или для каждого из вертексов?
Пока пишу в голове возникает мысль, что если вершина входит в hard-edge, то там так и так tangent-space будет своё для каждого треугольника. А если soft-edge, то по-идее и текстура и сам свет будет переходить плавно, значит в soft случая разных текстурных координат просто не будет.

Похоже сам себе ответил. Но буду признателен если кто-то прояснит немного. Не расчёт tangent-space сам!!! С ним уже более-менее я освоился. А именно с вершинами и потом массивом вертексов.

#31
15:17, 9 сен 2013

Проверил с кубом. Если ставить hard, то стало более менее понятно. Любая вершина будет иметь три нормали, то есть по сути разбивается на три вертекса, каждый имеет свою нормаль, соответствующую нормали одной из трёх граней куба, в которые он входит.

Если поставить кубу soft, то нормалей в obj стало ровно восемь, по числу вершин. Это понятно, потому что каждая вершина - суммирует нормали всех трёх граней.
Но вот текстурных координат стало 14.
Потому что есть например такие треугольники
f 7/7/8 8/8/7 2/10/2
f 2/2/2 8/11/7 6/12/5

То есть одна вершина номер 2 имеет одну нормаль, но при этом два разных набора текстурных координат.
А разные наборы - значит tangent-space будет другой.

Что в таком случае делать?
Дробить вершину на две, как будет при выводе, и для каждой делать свой расчёт tangent-space с одинаковой нормалью, но с разными tan-bitan.
Правильно понимаю?
Но ведь при освещении что я буду ждать - плавный переход света через этот soft-edge, значит в вершине должен быть один tangent-space, чтобы свет не скакал по граням.
Или даже при разных текстурных координатах всё равно tangent-space будет выходить один?
Или это и есть проблема швов, с которой я пока ещё не знаком.

#32
17:38, 9 сен 2013

Imaginary unit
Normal mapping without precomputed tangents: http://www.thetenthplanet.de/archives/1180

KpeHDeJIb
В последних Assassin`s Creed (начиная с AC3 вроде бы) используется именно он.

#33
21:43, 9 сен 2013

ИМХО весь этот ваш тангент спейс нужно отдавать на откуп художникам/моделлерам, нехер на себя чужую работу брать...

#34
0:31, 10 сен 2013

Я вам открою секрет. как получить идеальный тангент спейс  удовлетворяющий нужным требованиям.

создаем карту нормалей в обжект спейс.
проецируем каждый пиксель карты нормалей  на модель, получаем треугольник и коэф интерполяции в треугольнике.
интерполируем тангент спейсы  вершин и получаем тангент спейс для расмотренной точки.
переводим нормаль из обжект спейс в полученный тангент спейс.


нужно найти тангент спейс такие чтобы выполнялось::

дальше условия например
Z координата в  тангент спейс для всей карты нормалей была положительна.
или
сумма всех глов(косинусов углов) карты нормалей и вектора (0,0,1) должна быть минимальна.
или другое условие которое приводит к наилучшему качеству кодирования.

если в тангент спейс что то считается то можно наложить еще условие.
чтобы  угол между вектором и нормалью в обжект спейсе минимально отличался  отугла если их перевести в  тангент спейс.


Нужно ставить задачи такие.
есть исходные данные, на основе их что то считается. и надо найти исходные данные так чтобы результат расчетов минимально отличался от идеальных.

#35
10:03, 10 сен 2013

Проверил с кубом. Если ставить hard, то стало более менее понятно. Любая вершина будет иметь три нормали, то есть по сути разбивается на три вертекса, каждый имеет свою нормаль, соответствующую нормали одной из трёх граней куба, в которые он входит.

Если поставить кубу soft, то нормалей в obj стало ровно восемь, по числу вершин. Это понятно, потому что каждая вершина - суммирует нормали всех трёх граней.

Это не проблема TBN. Есть такая штука как группы сглаживания. Во многих форматах (3ds, obj и т.п.) данные представлены как: массив вершин (три координаты X,Y,Z), массив треугольников (3 индекса вершин + индекс группы сглаживания, иногда лежат отдельным массивом). При этом нельзя просто так забить на индекс группы сглаживания, и тупо переписать эти массивы в VBO. Нужно пройти по индексам вершин, и собрать новые буфера вершин (их будет столько, сколько разных групп сглаживания) и собрать новые буфера индексов (провести реиндексацию в соответсвии с новыми буферами вершин).

Только после этого можно приступать к построению TBN базиса, и тогда, совершенно внезапно исчезнут проблемы с усреднением. Почему-то про группы сглаживания многие забывают или забивают, а потом на форуме возникают посты/комментарии: нельзя построить правильный TBN.... все будет только приблеженно...

У тебя, -Alex-, должны быть группы сглаживания, и для обычного куба у каждой грани будет своя группа сглаживания. Поэтому твои 8 вершин должны превратиться в 6 групп по 4 вершины = 24 вершины.

#36
18:19, 10 сен 2013

bazhenovc
> Normal mapping without precomputed tangents:
> http://www.thetenthplanet.de/archives/1180
Попробовал прикрутить, но на экране какая-то фигня. Попробовал поменять местами Y и Z возвращаемого значения и при умножении TBN поменял местами матрицу с вектором. Теперь некоторые объекты освещаются правильно, а некоторые нет. При этом FPS упал почти в 2 раза. Невыгодный метод какой-то. Правда у меня 3 источника света и для всех проделывается эта операция.
И не понял, зачем для получения TBN нужен вектор на источник света?

#37
20:05, 10 сен 2013

У тебя, -Alex-, должны быть группы сглаживания, и для обычного куба у каждой грани будет своя группа сглаживания. Поэтому твои 8 вершин должны превратиться в 6 групп по 4 вершины = 24 вершины.

В obj не совсем так.
Есть массив вершин, массив текстурных координат и массив нормалей.
Дальше идут фейсы (трех-,четырёх или шестиугольники) встречал пока. Их надо уже при импорте дробить на треугольники.

Про 6 групп по четыре вершины понял.
Только в obj-формате при конверте для куба нет сглаживания, он ставит s off, что значит сглаживания нет, hard-режим. То есть каждая грань считается имеет свой набор нормалей = нормалям самого треугольника, без усреднений.
Для мягких, да, он делает группы.
С ними я более-менее понял.

В принципе, пересборка в новый массив, с новыми индексами и там уже переход вершин в новое количество - да, я понял.
Даже подсоединил расчёт TNB от ShaderX4. До этого пробовал разные другие. И сам писал исходя из алгоритма, но в ShaderX4 мне понравились дополнительные по углу. И ортогонализация финальная. Притом этот метод Грамма... какого-то там.
Странно, сделал вывод. Чисто визуально, после Грамма... есть ненормированные базисы tnb, пытаюсь понять, почему они возникают. Делаю ортогонализацию (проверил сорок раз), но всё равно после неё углы между векторами не 90 бывают. Хотя сам понимаю, что это бред. Буду ещё раз проверять ортогонализацию.

В общем, разбираюсь ещё. Сами сборку нового массива вершин осознал.
Добавлю туда работу с группами сглаживания - тогда просто буду группировать ещё и по ней.

#38
21:26, 10 сен 2013

Подскажите, какие тангенты должны быть у прямоугольника, нормаль которого (0,0,1), вершины такие: (-1, -1, 0), (1, -1, 0), (1, 1, 0), (-1, 1, 0). А то начал делать Bump mapping, а где-то взятая в Интернете генерилка не работает. Хочу задать вручную, чтобы протестировать простейший случай.
И ещё бинормали ведь можно не передавать, а посчитать как cross(tangent, normal)?

#39
23:45, 10 сен 2013

gammaker
1) Бинормаль - направление, в котором возрастает текстурная координата X
2) Тангент - направление, в котором возрастает текстурная координата Y
3)Лучше все же передавать и бинормаль и тангент, т.к. лишние расчеты не нужны, если можно обойтись без них.

#40
5:37, 11 сен 2013

-Alex-, ну я описал примерную суть. obj формат я глубоко не копал, и не помню всех деталей, использую 3ds, но делать надо примерно одно и то же (обнаружил это когда выбирал между obj и 3ds). Кстати бывают еще индексы материалов (в obj насколько я помню они лежат отдельно в файле массивом индексов фейсов), и тогда нужно делать ровно то же самое сначала для материалов, потом пилить по группам сглаживания... в общем увлекательная возьня.

По поводу ортогонализации - это зачем? Ненадо там ничего ортоганизировать, испортишь только картинку. Все находится однозначно через математику которая описана здесь: http://www.gamedev.ru/code/forum/?id=121050#m6
Единственно - для транглов у которых направление обхода по координатам в пространстве не совпадает с направлением обхода по текстурным координатам (это называется зеркальные фейсы) - надо выворачивать нормаль, чтобы матрица из правой превращалась в левую и наоборот.

Поэтому оптимально вычисление нормали запихнуть прямо в функцию нахождения TBN добавив в конец 2 строки:
N = normalize(cross(tangentX, tangentY));
if (dot(cross(F, G), N)>0.0) { N = undo(N); };

#41
7:39, 11 сен 2013

Big V
> 1) Бинормаль - направление, в котором возрастает текстурная координата X
> 2) Тангент - направление, в котором возрастает текстурная координата Y
Это я понял, но какой вершине приписать это направление? Той у которой координата 0 или 1? Мне нужно, чтобы мне дали гарантировано правильные готовые тангенты для плоскости, чтобы если вдруг будет что-то не так работать, знать, что ошибка в шейдере.


Big V
> 3)Лучше все же передавать и бинормаль и тангент, т.к. лишние расчеты не нужны,
> если можно обойтись без них.
Вроде бы размер вершины тоже влияет на производительность и его можно сократить одним лишь cross'ом. Он же вроде за одну инструкцию выполняется?

#42
7:58, 11 сен 2013
+ Ну приводили же код

p.s. Я только добавил выворачивание нормали для зеркальных фейсов.
На вход подаешь пространственные координаты треугольника и текстурные соответственно, на выходе получаешь TBN базис для всех трех углов треугольника. Если вершина участвует в нескольких трианглах, то аддитивно накапливаешь, а потом делишь на кол-во накоплений (можно нормализовать).

Вроде бы размер вершины тоже влияет на производительность и его можно сократить одним лишь cross'ом. Он же вроде за одну инструкцию выполняется?

Только тогда с зеркальными фейсами будет гавно :) ибо для того чтобы определить зеркальный фейс или нет - надо знать все 3 пространственные и текстурные координаты триангла. Проще подсчитать сразу.

#43
9:19, 11 сен 2013

За код расчёта спасибо, но для четырёхугольника хотелось бы задать их вручную.
А что за tangentX/Y/Z? Какие из них тангент, бинормаль и нормаль?

#44
9:28, 11 сен 2013

А что за tangentX/Y/Z? Какие из них тангент, бинормаль и нормаль?

Это и есть базис tangent space. tangentX - тангент, tangentY - бинормаль, tangentZ - нормаль.

За код расчёта спасибо, но для четырёхугольника хотелось бы задать их вручную.

Шутка такая? Четырехугольник = два треугольника.

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.