Касательные, бинормальные и другие связанные с шейдерами вещи - PullRequest
8 голосов
/ 07 ноября 2010

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

Это, очевидно, означает, что мои модели должны не только экспортировать позиции вершин , координаты текстуры и аппроксимированные нормали для каждой вершины , но также и одно из касательных пространств. базисные векторы (обычно tangent), потому что другой можно найти непосредственно в шейдере , используя cross(tangent, normal).

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

position -> normal ->  tangents
            uv     ->

Теперь - как с такими вещами справляются современные 3D-игры / движки рендеринга?

Они действительно предоставляют нормали , касательные и УФ-координаты для каждой вершины или они могут быть каким-то образом рассчитаны во время выполнения? Должны ли они быть частью данных модели или они должны быть доступны только во время выполнения?

Я также знаю, что при использовании Direct3D10+ с использованием геометрических шейдеров можно фактически подготовить нормали и касательные прямо во время выполнения (очевидно, потому что у нас есть доступ к вершинам в каждом треугольнике) - стоит ли это или должно быть всегда предварительно вычислено ?

Ответы [ 5 ]

6 голосов
/ 11 ноября 2010

Мой взгляд таков:

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

Нормальные значения: теоретически вы можете предварительно вычислить их в геометрическом шейдере или даже на процессоре во время загрузки. Но есть одна вещь: реальные модели в играх часто НЕ являются исходными моделями, а версиями с меньшим количеством полигонов. В последней модели, используемой в игре, у вас меньше вершин, но нормали на каждую вершину рассчитываются более точно из исходной модели высокого поли (которая также используется для расчета окклюзии окружающей среды и т. д.). Следовательно, возможно также рассчитать нормы.

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

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

3 голосов
/ 14 ноября 2010

Как правило, вы хотите заранее вычислить как можно больше. Большинство движков будут иметь собственный инструмент для написания, который может принимать необработанные данные из программного обеспечения 3D и преобразовывать их в формат для времени выполнения (добавляя касательные и битовые касания и т. Д.). Однако ...

В определенных ситуациях издержки памяти на каждую вершину могут вызывать особые проблемы с производительностью. Это связано с тем, что с перемещением данных о системе связаны накладные расходы - они «скрыты», поскольку они не являются явными в виде инструкции, добавляемой в шейдер, поэтому они немного более продвинуты.

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

Нормы , некоторые UV-отображения и другие вещи требуют знания "топологии" сетки - и эта топология обычно не присутствует в данных времени выполнения. Они также требуют дополнительной маркировки от художников; например, острые края и текстуры, швы и т. д. По этой причине нормали , УФ * и первая касательная будут почти всегда рассчитываться для всех, кроме очень специализированных типов геометрии.

Помните, что представление модели в Max, Maya или Blender сильно отличается от версии во время выполнения.

Редактор программного обеспечения

  • суп из треугольников и квадратов с информацией о соседях
  • края помечены как острые / мягкие
  • одна вершина может иметь несколько нормалей и несколько UV-координат

Время выполнения (для DirectX, OpenGL и т. Д.)

  • кэш-дружественная коллекция треугольных полос и треугольных вентиляторов
  • ребра неявны, к ним не привязана дополнительная информация
  • каждая вершина имеет только одну позицию, одну нормаль и одну координату UV (для текстуры)
  • иногда существует на нескольких уровнях детализации

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

2 голосов
/ 09 ноября 2010

Вы также можете сделать это с ID3DXMesh в D3D9. Вы всегда должны вычислять их заранее - потому что расточительно вычислять их снова во время выполнения. Однако для каждого меша вы бы вычисляли их только один раз, поэтому, если ваша программа процедурно не генерирует меши, вероятно, нет проблем с тем, где и когда это будет сделано.

Единственная важная вещь здесь - это вычислять их на процессоре, а не на графическом процессоре, потому что вы выполняете эту работу снова и снова на графическом процессоре каждый кадр, что является полной тратой по сравнению с одним разом на процессоре. Насколько я знаю, все системы 3D-рендеринга вычисляют нормали и тому подобное на процессоре один раз, сохраняют его в файл, а затем загружают и отправляют в графический процессор для работы.

1 голос
/ 09 ноября 2010

Я предпочитаю предварительно вычислять их, так как вам нужна специальная обработка со швами, зеркальными текстурами, обтеканиями и тому подобным.

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

0 голосов
/ 12 ноября 2010

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

...