2016-12-31 20 views
0

Я пытаюсь сразу преобразовать матрицу преобразования в шейдер с векторами, не делая ненужной транспортировки. Согласно mul документации HLSL по:Несоответствие порядка HLSL mul и D3DXMATRIX

mul(x, y) Умножение x и y с помощью матрицы математику. Внутренние размеры x-столбцов и y-строк должны быть равны.

x [in]x входное значение. Если x является вектором, он обрабатывается как строка вектор.

y [in]y ввод значение. Если y является вектором, он обрабатывается как вектор .

У меня в коде C++:

const D3DXMATRIX viewProjection = view * projection; 
... 
const D3DXMATRIX modelViewProjection = model * viewProjection; 

, где modelViewProjection является строка-мажорной матрицы для того, что копируется в буфер постоянная, а не транспонированный. Однако, для этого, чтобы работать в HLSL мне нужно умножить матрицу преобразования с вектором, как:

output.position = mul(transformation, position); 

которое противоположное тому, что говорит документация mul.

Может кто-нибудь объяснить, где здесь несоответствие?

ответ

0

deprecated D3DXMath библиотека и более современные DirectXMath использование row-major матричный заказ. Язык HLSL по умолчанию использует стандартный порядок столбцов, поскольку он немного более эффективен для умножения. Поэтому в большинстве случаев использование константных констант буфера будет передавать данные матрицы. Почти во всех случаях любая «стоимость» переноса матрицы здесь полностью скрыта всеми другими задержками в системе.

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

См. MSDN

+0

Спасибо! Я нашел эту директиву ['#pragma pack_matrix (row_major)'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd607354 (v = vs.85) .aspx) и ['D3DCOMPILE_PACK_MATRIX_ROW_MAJOR '] (https://msdn.microsoft.com/en-us/library/windows/desktop/gg615083 (v = vs.85) .aspx) константа компилятора. Но есть ли какая-либо ссылка относительно эффективности изменения порядка? Я просмотрел сгенерированный байт-код, единственным отличием является использование некоторых 'dcl_temps' ([details] (https://gist.github.com/anonymous/57b59374f51e29de928a2cb5bd3ae044)). – user367035