DX9과는 다르게 SetMatrix가 없으므로 상수버퍼를 만들어 매트릭스를 통으로 전달
HLSL에서는 열우선이므로 사용되기전 CPU나 GPU에서Transpose 해야 한다.
*Transpose [전치행렬] - 행과 열을 바꾼행렬 언제쓰냐면
1. 위처럼 HLSL을 위해(열우선) Matrix를 바꾸는 경우.
2. MatA 가 회전행렬인 경우(!!!) MatA의 전치행렬이 MatA의 역행렬과같다. 즉 역행렬 계산하는거보다 비용이 적다.
더 질문하자면 왜 HLSL은 열우선을 사용할까.
어찌보면 당연한게 vetext(float4) * matrix를 손으로 계산해보면 matrix의 1열,2열,3열,4열을 가져와 계산한다. GPU도 마찬가지
dst는 저장할 float4레지스터 , src0은 vertex가 담긴 레지스터 , src1는 연속된 열로 matrix가 담긴 상수레지스터
where
- dst is the destination register. Result is a 4-component vector.
- src0 is a source register representing a 4-component vector.
- src1 is a source register representing a 4x4 matrix, which corresponds to the first of 4
- consecutive registers.
dest.x = (src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z) +
(src0.w * src1.w);
dest.y = (src0.x * src2.x) + (src0.y * src2.y) + (src0.z * src2.z) +
(src0.w * src2.w);
dest.z = (src0.x * src3.x) + (src0.y * src3.y) + (src0.z * src3.z) +
(src0.w * src3.w);
dest.w = (src0.x * src4.x) + (src0.y * src4.y) + (src0.z * src4.z) +
(src0.w * src4.w);
GPU 레지스터에는 데이터를 기억하기위해 상수 레지스터가 있는데 그중 Color,Float,Integer 레지스터가 Dimention 이 4 이며 Boolean,1 이다. 즉 flat4를 사용한다. vertex * matrix 를 계산을 하기위해 레지스터의 사용 최소단위가 float4란 뜻이다.
쉐이더 어셈블리 명령을 보면 vetex * matrix 에 해당하는 m3x2,m3x3,m3x4,m4x4는 모두 열우선으로 작동한다.
즉 float4상수 레지스터에연속적으로 기록된 matrix정보로 한번의 명령으로 계산된다.
당연히 매트릭스 정보를 열우선으로 상수레지스터에 기록하지않는다면 m4x4 명령어는 사용할수없다.
즉 다른명령어를 사용해서 구차하게 명령어가 길어진다.
'과거 자료' 카테고리의 다른 글
[DX12] Microsoft::WRL::ComPtr (0) | 2022.12.12 |
---|---|
[DX12] DirectX12 노트 정리 계획 (0) | 2022.12.11 |
C++ 대입 연산 제한시키기 (0) | 2022.11.25 |
define 대신 const나 enum을 이용하자 (0) | 2022.11.24 |
오픈소스 라이브러리 (0) | 2022.11.15 |