새소식

인기 검색어

게임 개발/그래픽스

Row-Major order vs Column-Major order

  • -

Row-Major: DirectX, Maya, PBRT 에서 사용

Column-Major: 대부분의 학술적인 곳, opengl, Vulkan, HLSL에서 사용.

 

왜 불편하게 굳이 Column-Major를 사용하는가? -> 속도가 약간 더 빠르다고 한다.

더보기

direct3d - HLSL mul and D3DXMATRIX order mismatch - Stack Overflow

 

HLSL mul and D3DXMATRIX order mismatch

I'm trying to multiply the transformation matrix in shader with vectors directly without doing unnecessary transportation. According to HLSL's mul documentation: mul(x, y) Multiplies x and y using

stackoverflow.com

The HLSL language defaults to using column-major matrix order as it's slightly more efficient for multiplies.

 

HLSL mul() and row/column major matricies in directx - For Beginners - GameDev.net

 

HLSL mul() and row/column major matricies in directx

I have my WVP matrix = World * View * Projection in direct3D. If directx stores its matrices in row major style, and the hlsl mul() function can have mul(vertex, matrix) as row major style multiplication, then why must I tranpose the directx matrix before

gamedev.net

According to a post on gamedev.net, HLSL by default expects column-major packed matrix, and not row-major. Having single column in one constant register allows to quickly calculate resulting vector component with one dot instruction. Single mul (row-vector, column-major-matrix) will be calculated as: dp4 oPos.x, v0, c0 dp4 oPos.y, v0, c1 dp4 oPos.z, v0, c2 dp4 oPos.w, v0, c3.

 

주의할 점!!!

DirectX에서는 Row major, HLSL에서는 기본이 Column major이다.

그런데 HLSL의 mul함수는 vector, 행렬 순으로 입력 파라미터를 받는다.

즉, 벡터표기방법은 row major를 사용함 (헷갈리게...)

마이크로소프트 공식문서에서 권장하는 방법은 SimpleMath의 행렬을 Transpose해서 HLSL쉐이더로 보내주는 것.

'게임 개발 > 그래픽스' 카테고리의 다른 글

D3D 시작 [1/4] - Direct3D 개요  (1) 2023.11.25
COM (Component Object Model)  (0) 2023.11.25
조명(SimpleMath)  (0) 2023.11.23
DirectXMath(SimpleMath)  (1) 2023.11.22
조명(GLM행렬), 노멀 벡터 변환  (1) 2023.11.22
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.