인프런 커뮤니티 질문&답변

김도형님의 프로필 이미지
김도형

작성한 질문수

[게임 프로그래머 도약반] DirectX11 입문

CreateInputLayout 도중 Offset 관련하여

작성

·

338

0

강의를 듣고 있는 도중 질문이 하나 생겼습니다 강의 16:05 부분입니다.

강사님께서 CreateInputLayout을 하기 위해 이전 작업으로 D3D11_INPUT_ELEMENT_DESC라는 구조체를 만드셨고 내부의 요소로 UINT AlignedByteOffset; 이러한 변수가 있었습니다.

강의에서 강사님께서 이 부분은 변수가 시작되는 지점을 적는 변수라고 알려주시고 Color가 시작되는 지점이 12Byte라고 하셨는데 이 D3D11_INPUT_ELEMENT_DESC라는 구조체로 설명하려하는 것이 이 전에 선언해두었던

struct Vertex

{

Vec3 position;

Color color;

};

라는 구조체였다면 구조체의 메모리 패딩에 따라 제일 큰 변수의 메모리 크기씩 영역이 쪼개져서 16Byte씩 끊어지니깐 position은 0 ~ 12구간 그리고 12 ~ 16 구간은 메모리 패딩으로 인해 비어져 있고 16 ~ 32까지가 color가 있는 구간으로 알고있었습니다 그래서 제가 잘못 생각하고 있는건가해서 12대신 16을 넣어봤는데 정상적인 색이 안나오지 않더라고요.

제가 개념을 잘못 알고있는건가 아니면 제대로 알고 있는데 이 부분만 특수한 케이스로 12라고 입력이 된건가를 잘 모르겠어서 개념을 확실히 잡고 가야된다고 생각해서 질문 드립니다 혹시 어디가 잘못된 건지 알려주실 수 있으신가요?

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

D3D11_INPUT_ELEMENT_DESC 구조체의 AlignedByteOffset 멤버 변수는 입력 요소가 시작되는 지점의 바이트 오프셋을 나타내는 변수입니다. 이 값은 구조체의 메모리 패딩이 적용된 이후의 바이트 위치를 나타냅니다.

예를 들어, struct Vertex{ Vec3 position; Color color; }; 구조체의 경우 position 멤버 변수가 0 ~ 12 바이트를 차지하고, 12 ~ 16 바이트는 메모리 패딩으로 비워져 있습니다. 그리고 color 멤버 변수가 16 ~ 32 바이트를 차지하게 됩니다.

강사님께서 강의 중에 “Color가 시작되는 지점은 12 바이트이다”라고 설명하셨을 때, 이는 position 멤버 변수 다음 바이트 위치인 12 바이트를 의미합니다. 구체적인 코드나 강의 내용이 없어서 더 정확한 해석이 어렵지만, 일반적인 경우에는 position 멤버 변수의 크기가 12 바이트이고, color 멤버 변수가 바로 그 뒤에 위치하게 됩니다.

따라서, CreateInputLayout을 호출할 때 AlignedByteOffset 멤버 변수에는 12 대신 16을 넣으시면 정상적인 동작을 기대할 수 있을 것입니다. 값이 정상적인 색상이 나오지 않을 때에는 다른 부분에서의 오류가 있을 수 있으니, CreateInputLayout 호출 시 다른 인자들도 재확인하는 것이 좋습니다.

더 자세한 내용이 필요하신 경우에는 구체적인 코드나 강의 내용을 공유해주시면 더 정확한 답변을 드릴 수 있을 것입니다. 감사합니다.

김도형님의 프로필 이미지
김도형
질문자

image
여기서 offset 칸에 12를 넣었더니 잘 작동되고 16을 넣으니 제대로 작동이 안되더라고요 그래서 혹시나 구조체 크기를 재봤더니 28Byte더라고요 Vec3 + Color이면 12 + 4(패딩) + 16 = 32인데 왜 28이지 하면서 검색해봤더니 컴파일러가 64비트 기준으로 운영되서 구조체 내부에 64비트가 넘는 자료형이 있으면 컴파일러가 더 이상의 패딩을 포기한다고 하네요 그래가지고 원래 패딩이 되면 16Byte 위치에 와야되는 변수가 12Byte 위치에 와서 offset이 12라고 했을때가 정상 작동했나 싶기도 한데 이건 어떻게 생각하세요?

김도형님의 프로필 이미지
김도형

작성한 질문수

질문하기