Страница 1 из 1

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

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

Изображение

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

СообщениеДобавлено: 12 фев 2010, 09:50
Paul Siberdt
Ща попробую... только есть настойчивая мысля (ее тож проверю):

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

Ну, да, хреначьте в массив тангентов, скажем, вектор (-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, или, что еще проще - между любыми вертексами-соседями, что формируют ширину дороги (если у вас мэппинг сверху вниз).

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

СообщениеДобавлено: 12 фев 2010, 10:01
Tolking
Кто они такие? Эти тангентсы?

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

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

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

По документации, тангент - это дирекшен-вектор вертекса, направленный в сторону +U, дополнительная компонента сообщает о состоянии патча равертки (прямое или инверснутое)

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

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

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

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

В таком случае тангет будет направлен перпендикулярно сплайну, а бинормаль параллельно

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

СообщениеДобавлено: 12 фев 2010, 11:09
Neodrop
Всё. Лучше сразу застрелите. ~x(

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

СообщениеДобавлено: 12 фев 2010, 11:15
Paul Siberdt
В любом случае, создавайте массив тангентов для теста дороги, например, ( 1, 0, 0, 1 ) вешайте читаемую карту нормалей, создавайте источник света и, покрутив его во вьюпорте, проверьте результат освещения.

Если дырки станут выпуклостями, поменяйте вектор на ( 1, 0, 0 -1 ), если, скажем, "вправо" будет перепутано с "вниз" - попробуйте ( 0, 0, 1, 1 ) ... я никогда с тангентами не занимался вживую, потому не могу отрендерить правильный результат в голове :D .. но, при любом раскладе, в самом худшем случае потребуется перебрать лишь 4 варианта вектора:)

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

СообщениеДобавлено: 12 фев 2010, 11:20
Neodrop
:ymhug: Вот это уже радует. Проверю чуть позже!
В конце концов этот генератор в Antares пишется, так что, кто знает, может и вам пригодиться.

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

СообщениеДобавлено: 12 фев 2010, 11:20
Battle Angel Alita
Синтаксис:
Используется 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

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

СообщениеДобавлено: 13 фев 2010, 02:57
Neodrop
У кого-нить не найдётся текстурки дороги с бампом для экспериментов? :-?

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

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

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

Изображение

Изображение

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

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

Изображение