shader-slang / slang

Making it easier to work with shaders
MIT License
2.06k stars 177 forks source link

improper matrix indexing with SLANG_MATRIX_LAYOUT_COLUMN_MAJOR #4401

Open sivansh11 opened 3 months ago

sivansh11 commented 3 months ago

matrix indexing not working as expected with sessionDesc.defaultMatrixLayoutMode = SlangMatrixLayoutMode::SLANG_MATRIX_LAYOUT_COLUMN_MAJOR

test shader


uniform struct uniform_t {
    float4x4 *p_result;
} uniform;

float4 operator *(float4x4 mat, float4 vec) {
    return mul(mat, vec);
}

#define IDENTITY_MATRIX float4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)

// code taken from glm
float4x4 translate(float4x4 m, float3 v) {
    float4x4 result = m;
    result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; 
    return result;
}

[shader("compute")]
[numthreads(1,1,1)]
void computeMain(uint3 threadId : SV_DispatchThreadID)
{
    uniform.p_result[0] = translate( IDENTITY_MATRIX, { 1, 2, 3 });
}```

on running the test shader, I am getting
*p_result = mat4x4((1.000000, 0.000000, 0.000000, 1.000000), (0.000000, 1.000000, 0.000000, 2.000000), (0.000000, 0.000000, 1.000000, 3.000000), (0.000000, 0.000000, 0.000000, 1.000000))

when it should be 
(glm::translate(glm::mat4{ 1.f }, { 1, 2, 3 })  = mat4x4((1.000000, 0.000000, 0.000000, 0.000000), (0.000000, 1.000000, 0.000000, 0.000000), (0.000000, 0.000000, 1.000000, 0.000000), (1.000000, 2.000000, 3.000000, 1.000000))

currently on commit: 5da06d43bb0997455211ca56597c4302b09909ab