Инвертирующая матрица в HLSL

У меня есть объект в HLSL, и я использую аппаратное ускорение для рендеринга нескольких копий. Но, когда дело доходит до вершинных нормалей, я немного приподнялся. В настоящее время я не использую нормальное отображение (хотя планирую его реализовать в ближайшее время), я просто помещаю нормали внутри структуры вершины. Я могу поместить матрицу мира и получить ее в HLSL просто отлично, но мне нужна обратная транспозиция, если я хочу, чтобы мировое положение вершины было нормальным из пространства объектов. Как инвертировать матрицу в HLSL? Или мне придется отправить матрицу и она инвертирована в буфере экземпляра?

Или это означает, что нормальное отображение не требует?

5 голосов | спросил DeadMG 25 PMpMon, 25 Apr 2011 18:19:25 +040019Monday 2011, 18:19:25

3 ответа


7
  

Или это то, что обычно   отображение не требует?

Правильно, нормальное сопоставление не требует этого.

В большинстве случаев наилучшим способом нормального отображения является сохранение нормальных нормалей карты в касательном пространстве. То есть нормальная нормальная карта, указывающая в том же направлении, что и нормаль поверхности <0,0,1 & gt ;. (Вот почему многие нормальные карты в основном синие, поскольку они хранятся в касательном пространстве.)

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

Это означает, что вы сделаете, возможно, 2-10 матричных умножений на CPU, сохранив тысячи или миллионы преобразований на графическом процессоре.

См. эту статью для более подробного объяснения нормального отображения и касательного пространства: http://www.gamasutra.com/view/feature/1515/messing_with_tangent_space.php

ответил Olhovsky 28 AMpThu, 28 Apr 2011 03:17:18 +040017Thursday 2011, 03:17:18
6

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

ответил mayatrone 26 AMpTue, 26 Apr 2011 00:01:46 +040001Tuesday 2011, 00:01:46
4

Не нужно - вам нужно будет сделать это для каждой вершины для правильного шейдера вершин, и это огромная трата времени GPU. Любое сложное, подобное этому, которое может быть предварительно вычислено, должно быть предварительно рассчитано.

ответил Luther 26 AMpTue, 26 Apr 2011 00:39:33 +040039Tuesday 2011, 00:39:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132