Зачем нам нужно использовать транспонирование преобразованной матрицы? (директ3D11)

Я прочитал SimpleMath, а также прочтите руководство программиста статьи, но я, кажется, не могу понять цель транспонирования матрицы после ее "преобразования"

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

Возьмем, к примеру, этот фрагмент кода.. (при условии, что матрицы уже созданы для CameraView и CameraProjection)

World = XMMatrixIdentity();                             

WVP = World * CameraView * CameraProjection;

XMMatrixTranspose(WVP)      

Итак, мой вопрос: какова цель транспонирования WVP? какой цели это служит для Direct3D 11?


person Soon_to_be_code_master    schedule 19.07.2015    source источник
comment
Конечно, это зависит от того, что вы собираетесь делать с матрицей?   -  person Oliver Charlesworth    schedule 19.07.2015
comment
Ну, скажем, я просто хочу создать 3D-сцену с камерой и проекцией в ней. Если я транспонирую преобразованную матрицу, что это будет делать?   -  person Soon_to_be_code_master    schedule 19.07.2015
comment
Нет, но конкретно какую математическую операцию вы собираетесь выполнять с WVP? Транспонирование на самом деле ничего не делает; он просто заменяет предварительное умножение векторов-столбцов пост-умножением векторов-строк (и наоборот). Без контекста, это все, что можно сказать ;)   -  person Oliver Charlesworth    schedule 19.07.2015
comment
Шаблон заключается в том, что транспонирование происходит непосредственно перед установкой его в буфер констант, который отправляется в шейдер HLSL... На самом деле это означает преобразование матрицы основной строки в матрицу столбца. главная матрица.   -  person Chuck Walbourn    schedule 20.07.2015


Ответы (1)


Прежде всего, давайте посмотрим, как матрицы могут быть представлены в памяти. Рассмотрим следующую матрицу.

1 2 3
4 5 6
7 8 9

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

Младший адрес [ 1 2 3 4 5 6 7 8 9 ] Старший адрес

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

Младший адрес [ 1 4 7 2 5 8 3 6 9 ] Старший адрес

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

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

person danieltm64    schedule 19.07.2015
comment
HLSL requires your matrices to be supplied in column-major order ах, большое спасибо, теперь мне все понятно :) - person Soon_to_be_code_master; 20.07.2015
comment
HLSL не требует этого, он просто по умолчанию использует основной столбец. Это подробно описано в Руководстве программиста DirectXMath в разделе Работа с D3DXMath в разделе Использование DirectXMath с Direct3D и в ссылке на соответствующий документы HLSL. Вкратце: DirectXMath поддерживает как левые, так и правые координаты просмотра, но все матрицы являются основными по строкам. Вы можете указать HLSL использовать упорядочение по строкам, но по умолчанию используется распределение по столбцам, что немного быстрее. Следовательно, транспонировать непосредственно перед установкой CB. - person Chuck Walbourn; 20.07.2015
comment
Чтобы сделать это более явным, я добавил этот раздел в документы SimpleMath на набор инструментов DirectX на GitHub. - person Chuck Walbourn; 20.07.2015