HLSL 구조체 채우기
HLSL에서 사용하는 구조체(입력용 구조체 포함)은 메모리에 저장,해석될 때 다음과 같은 규칙을 따른다. 바로 32비트 4개짜리 벡터 단위로 저장이 된다. 예를 들어 다음 구조체는 메모리에 다음과 같이 저장된다.
cbuffer cb1 : register(b0)
{
float4 a;
float3 b;
float c;
float2 d;
float3 e;
}
vector1 {a.x, a.y, a.z, a.w}
vector2 {b.x, b.y, b.z, c}
vector3 {d.x, d.y, empty, empty}
vector4 {e.x,e.y,e.z,empty}
위에서 보듯이 한 요소가 두 벡터에 걸쳐서 저장되는 것이 불가능하다. 따라서 cpu에서 gpu쉐이더 입력 구조체에 데이터 복사 입력용으로 사용하는 구조체는 4차원 벡터 단위로 저장하는 것이 바람직 하다. 이에는 두가지 이유가 있다. 첫번째는 용량의 절약을 위해서이다. 두번째는 cpu구조체는 위 규칙없이 무조건 일련으로 데이터를 저장하는데 반해 gpu는 위 규칙대로 구조체를 해석하기에 데이터를 그대로 gpu에 카피하면 해석에 왜곡이 생긴다. 따라서 cpu에서 gpu자원에 저장전 따로 empty처리를 해주는 식으로 해야하는데 애초에 4차원 벡터 단위로 멤버를 설정하면 이를 하지않아도 되기 때문이다.
구조체와는 달리 배열의 경우 각 요소를 각각을 하나의 4차원 벡터단위로 저장한다. 이 역시 고려할 필요가 있다.
참고로 정점 버퍼의 경우 hlsl 입력 구조체를 사용한다고 해도 입력배치서술에서 몇번째 비트가 어떤 의미소에 전달되는지를 정확히 명시하기 때문에서 인지 이러한 규칙을 고려하지않아도 되는 것 같다.
색인 버퍼도 hlsl에 구조체등으로 전달되는 일은 없기에 이러한 규칙을 전혀 고려하지않는다.
참고서적
DirectX 12를 이용한 3D 게임 프로그래밍 입문
'그래픽스 > DirectX12' 카테고리의 다른 글
[Directx12][~9장][실습]Block Game (0) | 2023.03.21 |
---|---|
[Directx12][9장]텍스처 (0) | 2023.03.21 |
[Directx12][8장][1]조명 (1) | 2023.03.21 |
[Directx12][7장]파이프라이닝2 (0) | 2023.03.21 |
[Directx12][6장][2]파이프라이닝 구현 (0) | 2023.03.21 |