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

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

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

OutPosition = mul( InPosition, mViewProj ); 

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

OutPosition = mul( mViewProj, InPosition );

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

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

OutPosition = mul( mViewProj, InPosition );

но когда я отлаживаю это в pix или nsight, я обнаружил, что параметр marix хранится в регистре, как и в памяти, например: if 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 * матрица.

1 ответ

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

Другие вопросы по тегам