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