Quick Reference
text
CPU math convention
-> combined matrix order
-> constant-buffer storage/transpose
-> HLSL declaration row_major/column_major
-> mul(vector, matrix) 또는 mul(matrix, vector)Row-major memory storage와 row-vector multiplication은 같은 개념이 아닙니다. 한 샘플의 XMMatrixTranspose를 이유 없이 복사하지 말고 CPU에서 만든 점이 shader에서 어느 공간으로 가는지 test vector로 확인합니다.
계약 고정
DirectXMath는 row vector 형태의 연산을 제공하므로 대표적으로 world * view * projection을 만들고 HLSL 기본 column-major constant layout에 맞춰 upload 전에 transpose하는 패턴을 자주 사용합니다. 반대로 HLSL에 row_major를 명시하고 mul(position, matrix)를 일관되게 사용할 수도 있습니다.
두 방식 모두 가능하지만 renderer 안에서 섞지 않습니다. Identity, translation, 90-degree rotation처럼 결과를 손으로 아는 matrix test를 CPU와 shader 양쪽에 둡니다.
자주 틀리는 점
- Matrix를 두 번 transpose해 우연히 일부 transform만 맞게 만들지 않습니다.
- Translation 위치만 보고 전체 convention을 판단하지 않습니다.
- Non-uniform scale normal에는 world matrix가 아니라 inverse-transpose를 사용합니다.
- Constant buffer의 16-byte packing과 matrix major order를 별개로 확인합니다.
참고 링크
2 sources