я понимаю, что в математической библиотеке 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 * матрица.