작성
·
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 호출 시 다른 인자들도 재확인하는 것이 좋습니다.
더 자세한 내용이 필요하신 경우에는 구체적인 코드나 강의 내용을 공유해주시면 더 정확한 답변을 드릴 수 있을 것입니다. 감사합니다.
여기서 offset 칸에 12를 넣었더니 잘 작동되고 16을 넣으니 제대로 작동이 안되더라고요 그래서 혹시나 구조체 크기를 재봤더니 28Byte더라고요 Vec3 + Color이면 12 + 4(패딩) + 16 = 32인데 왜 28이지 하면서 검색해봤더니 컴파일러가 64비트 기준으로 운영되서 구조체 내부에 64비트가 넘는 자료형이 있으면 컴파일러가 더 이상의 패딩을 포기한다고 하네요 그래가지고 원래 패딩이 되면 16Byte 위치에 와야되는 변수가 12Byte 위치에 와서 offset이 12라고 했을때가 정상 작동했나 싶기도 한데 이건 어떻게 생각하세요?