Касательной, binormal и других шейдер-связанные вещи

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

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

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

position -> normal ->  tangents
            uv     ->

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

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

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

5 ответов


мое мнение таково:

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

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

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

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


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

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

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

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

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

редактор

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

времени (для DirectX, OpenGL, и т. д.)

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

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


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

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


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

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


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