путать с умножением основной строки и основной матрицы столбца в hlsl

я понимаю, что в математической библиотеке d3dx или библиотеке xnamath матрица сохраняется в памяти. в структуре эффекта, когда мы устанавливаем параметр матрицы с помощью setvariable интерфейса эффекта, он транспонирует целевую матрицу. если я не использую структуру эффектов, я должен установить параметр шейдера с помощью SetVertexConstantF...

но когда я использую структуру эффектов, я должен преобразовать вершины с помощью этого кода:

OutPosition = mul( InPosition, mViewProj ); 

в обычном коде шейдера без структуры эффекта я должен использовать:

OutPosition = mul( mViewProj, InPosition );

если я изменю порядок этого, он будет работать неправильно.

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

OutPosition = mul( mViewProj, InPosition );

но когда я отлаживаю это в pix или nsight, я обнаружил, что параметр marix хранится в регистре, как и в памяти, например: если mViewProj:

x0 y0 z0 w0
x1 y1 z1 w1
x2 y2 z2 w2
x3 y3 z3 w3

в регистре вершинного шейдера:

c0:x0 y0 z0 w0
c1:x1 y1 z1 w1
c2:x2 y2 z2 w2
c3:x3 y3 z3 w3

это похоже на магазин как основной ряд. Зачем?

это противоречит основным правилам матричного умножения: основной столбец: матрица * vec основной ряд: vec * матрица.


person Hikari    schedule 31.03.2014    source источник


Ответы (1)


HLSL использует Column-Major, а XNAMath использует ROW-Major. Транспонирование ваших матриц перед их подачей в шейдер HLSL должно работать. Я тоже был в замешательстве два дня назад.

person Ahmed Saleh    schedule 18.11.2014