Constant Buffer에 float3 타입 변수 2개를 저장할 일이 있었다. float이 3개짜리므로 12바이트 크기다.
상수 버퍼는 16바이트 단위로 정렬해줘야 한다는 것을 알고 있었지만 컴파일러가 알아서 패딩 데이터를 붙여준다고 생각했다.
위 상수 버퍼 구조체의 각 변수의 타입은 12바이트인데 두 바이트 블럭 사이에 알아서 패딩 데이터 4바이트가 붙을 줄 알았다. 그래서 괜찮겠지 하고 구조체 변수를 선언하여 사용하였다.
그런데 셰이더의 결과가 무언가 이상했다. 노랑색 픽셀이 나올만한 이유가 없는데 계속 노란색 픽셀이 등장했다. 그래서 무엇이 원인인지 찾다가 빛의 색상을 노란색으로 인식한다는 것을 알아냈다.
나는 분명 LightColor를 White(1.f, 1.f, 1.f)를 주었다. 그리고 아래와 같이 값을 확인해봐도 정상적이었다.
노랑은 (1.f, 1.f, 0.f)인데.. 혹시나 싶어서 해당 변수의 메모리 배열을 확인해 보았다. 그런데 다음과 같이 되어 있었다.
하나의 블럭은 4바이트 단위이고 빨간 줄은 네 블럭이므로 16바이트 단위이다. 잘 보면 똑같은 값 3개가 있는데, 딱 봐도 이 3f800000이 1.0이었다. 1.0은 LightColor의 성분이므로 모두 두 번째 빨간 줄에 있어야 했다. 근데 이 값 하나가 LightDir의 뒤에 붙어 있었다.
원래라면 LightDir의 3번째 블럭 뒤에 패딩 데이터가 붙을 줄 알았는데 붙지 않고 LightColor의 x가 LightDir 메모리에 붙어버린 것이다. 그래서 LightColor는 노랑(1.f, 1.f, 0.f)이 되었던 것이다..
타입을 float4로 해주니까 정상적으로 나온다 ㅋㅋ..
'게임 공부 > 게임 개발 일지' 카테고리의 다른 글
세 종류의 라이팅 구현 (3) - Point Light 편 (0) | 2021.08.13 |
---|---|
세 종류의 라이팅 구현 (2) - Directional Light 편 (0) | 2021.08.11 |
세 종류의 라이팅 구현 (1) - 소개 | Directional Light, Point Light, Spot Light (0) | 2021.08.05 |
현재 라이팅 문제점 (1) (0) | 2021.07.17 |
비동기 소켓과 멀티 스레딩을 활용한 소켓 함수 사용의 차이 (0) | 2021.05.30 |
댓글