(Directx12) (8장) (2) HLSL 구조체 채우기

HLSL 구조 채우기

HLSL에서 사용되는 구조(입력 구조 포함)는 메모리에 저장되고 해석될 때 다음 규칙을 따릅니다. 4 32비트의 벡터 단위로 저장됩니다. 예를 들어 다음 구조는 메모리에 다음과 같이 저장됩니다.

cbuffer cb1 : 레지스터(b0)

{

float4a;

float3b;

수영 선수 c;

float2d;

float3 e;

}

.

벡터1 {ax,ay,az,aw}

벡터2 {bx, 통해, bz, c}

벡터3 {dx,dy,blank,blank}

vector4 {ex,ey,ez,empty}

.

위에서 본 것처럼 두 벡터에 걸쳐 요소를 저장하는 것은 불가능합니다. 따라서 CPU에서 GPU 셰이더의 입력 구조로 데이터 복사 입력에 사용되는 구조를 4차원 벡터 단위로 저장하는 것이 바람직하다. 두 가지 이유가 있습니다. 첫 번째는 용량을 절약하는 것입니다. 둘째, 위 규칙이 없으면 CPU 구조는 무조건 데이터를 직렬로 저장하고 GPU는 위 규칙에 따라 구조를 해석하므로 그대로 GPU에 데이터를 복사하면 해석 왜곡이 발생한다. 따라서 CPU의 GPU 리소스에 저장하기 전에 별도로 빈 처리를 수행해야 하는데 애초에 4차원 벡터 단위로 멤버를 넣는다면 그럴 필요가 없다.

.

구조체와 달리 배열은 각 요소를 4차원 벡터 단위로 저장합니다. 이것도 고려해야 합니다.

.

정점 버퍼의 경우 hlsl 입력 구조가 사용되는 경우에도 입력 레이아웃 설명의 비트 수가 전송되는 의미 체계를 정확히 지정하기 때문에 이러한 규칙이 적용되지 않는 것 같습니다.

인덱스 버퍼가 구조로 hlsl에 전달되지 않기 때문에 이러한 규칙은 전혀 적용되지 않습니다.

.

.

.

.

참고 도서

DirectX 12를 사용한 3D 게임 프로그래밍 소개