Mesh.tangents : Как посчитать для процедурных моделей?

Шейдеры и все-все-все.

Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Neodrop 12 фев 2010, 05:06

Размещаю вопрос в этом разделе форума, потому что тангенсы относятся именно к шейдерам.
Вопрос : делаю процедурные меши. Дороги к примеру. Но на них не работают шейдеры типа бампа или параллакса. Ругается на то, что шейдер нуждается в тангенсах.
Банально не врубаюсь, что это за звери и как их посчитать для меша? Подскажите, на примерчике квадрата из двух трианглов. :-?

Изображение
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Paul Siberdt 12 фев 2010, 09:50

Ща попробую... только есть настойчивая мысля (ее тож проверю):

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

Ну, да, хреначьте в массив тангентов, скажем, вектор (-1.0, 0.0, 0.0, -1.0) и больше ничего не нужно.
Знаки тут определяют направление построения патча развертки, вероятно, у меня в плашке с этим проблема, потому и "минус" вылез. В любом случае, если нормал неправильно обработает источник света, просто замените знак четвертой компоненте.


Да, насчет значений... единички и нули придется подобрать вручную, в зависимости от алгоритма построения дороги.
Если дорога строится вперед (+Z), и ювишки мапят дорогу сверху вниз (+V совпадает с +Z) и в том же направлении, что и построение вертексов, похоже, тангент-вектор будет типа такого:
Код: Выделить всё
Vector4 ( 0.0, 0.0, -1.0, 1.0);


Можно и не вручную, конечно, если найти локальный вектор между вертексом с uv == ( i, j) и вертексом с uv == ( i, k ), где k > j, или, что еще проще - между любыми вертексами-соседями, что формируют ширину дороги (если у вас мэппинг сверху вниз).
Последний раз редактировалось Paul Siberdt 12 фев 2010, 10:37, всего редактировалось 12 раз(а).
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Tolking 12 фев 2010, 10:01

Кто они такие? Эти тангентсы?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Paul Siberdt 12 фев 2010, 10:06

Тангенты говорят, в какую сторону идет построение развертки, чтобы верно связать UV с XYZ. Потому как художник может не только бросать планары, а еще крутить куски текстурных координат, как ему заблагорассудится.
Например, модель персонажа частенько текстуится наполовину, вторая половина миррорится. Если положить нормалмап на такую модель, половина модели будет освещена с обратным эффектом. Тангенты сообщают, что половина развертки отмиррорена и помогают исправить результат.

В случае с процедурной геометрией, как правило, развертка создается потайлово и квадратно-гнездовым способом, что не требует генерации тангентов.

По документации, тангент - это дирекшен-вектор вертекса, направленный в сторону +U, дополнительная компонента сообщает о состоянии патча равертки (прямое или инверснутое)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Neodrop 12 фев 2010, 11:01

Само собой, у меня меш текстуриться вперёд. То есть U для любой левой вершины дороги равен 0, а для любой правой, равен 1.
Что это даёт в моём случае, Пауль? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Battle Angel Alita 12 фев 2010, 11:05

Neodrop писал(а):Само собой, у меня меш текстуриться вперёд. То есть U для любой левой вершины дороги равен 0, а для любой правой, равен 1.
Что это даёт в моём случае, Пауль? :-?

В таком случае тангет будет направлен перпендикулярно сплайну, а бинормаль параллельно
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Neodrop 12 фев 2010, 11:09

Всё. Лучше сразу застрелите. ~x(
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Paul Siberdt 12 фев 2010, 11:15

В любом случае, создавайте массив тангентов для теста дороги, например, ( 1, 0, 0, 1 ) вешайте читаемую карту нормалей, создавайте источник света и, покрутив его во вьюпорте, проверьте результат освещения.

Если дырки станут выпуклостями, поменяйте вектор на ( 1, 0, 0 -1 ), если, скажем, "вправо" будет перепутано с "вниз" - попробуйте ( 0, 0, 1, 1 ) ... я никогда с тангентами не занимался вживую, потому не могу отрендерить правильный результат в голове :D .. но, при любом раскладе, в самом худшем случае потребуется перебрать лишь 4 варианта вектора:)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Neodrop 12 фев 2010, 11:20

:ymhug: Вот это уже радует. Проверю чуть позже!
В конце концов этот генератор в Antares пишется, так что, кто знает, может и вам пригодиться.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Battle Angel Alita 12 фев 2010, 11:20

Синтаксис:
Используется cpp
// ** v0, v1, v2 - вершины триугольника
void cStaticMesh::ComputeTangentBasis( const sMeshVertex& v0, const sMeshVertex& v1, const sMeshVertex& v2, cVector3& tangent, cVector3& bitangent )
{
   cVector3 e0 = v1.position - v0.position;
   cVector3 e1 = v2.position - v0.position;
   cVector2 e0uv = v1.uv - v0.uv;
   cVector2 e1uv = v2.uv - v0.uv;

   float cp = e0uv.y * e1uv.x - e0uv.x * e1uv.y;

   if ( cp != 0.0f ) {
      float k = 1.0f / cp;
      tangent   = (e0 * -e1uv.y + e1 * e0uv.y) * k;
      bitangent = (e0 * -e1uv.x + e1 * e0uv.x) * k;

      tangent.Normalize();
      bitangent.Normalize();
   }
}

Стырено отсюда - http://www.gamedev.ru/code/forum/?id=73475
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Neodrop 13 фев 2010, 02:57

У кого-нить не найдётся текстурки дороги с бампом для экспериментов? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Neodrop 13 фев 2010, 12:13

Вроде всё Ок (по алгоритму, от Алиты), но вылезла та же проблема с ZWrite как тут : viewtopic.php?f=35&t=1552
Причём, простое комментирование ZWrite Off не помогает. Равно как и вписывание ZWrite On

Лезут дырки... Кто-нить в курсе, что это может быть и как поправить? :-?

Изображение

Изображение
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mesh.tangents : Как посчитать для процедурных моделей?

Сообщение Neodrop 13 фев 2010, 13:52

Да, тангенсы однозначно правильно посчитаны. Но не применить к дороге из-за глюков Transparent/Bumped Diffuse :(
Это заметно на пригорке (как на скринах выше)

Изображение
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2