Я пытаюсь сразу преобразовать матрицу преобразования в шейдер с векторами, не делая ненужной транспортировки. Согласно 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
.
Может кто-нибудь объяснить, где здесь несоответствие?
Спасибо! Я нашел эту директиву ['#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