[1]. 쉐이더 파일을 적용함으로써, 나의 목적은, 실제 정점과 인덱스 버퍼 들을 쉐이더 파일에 바인딩해서 무언갈 그려내는 것이다.

[2]. 쉐이더 파일 속의 코드 내용을 살펴보면, 정점의 정보를 받아오고 결과를 호출하는 VS_IN / VS_OUT 이라는 사용자 정의 타입 구조체와, 그 정점들을 받아와서 픽셀로 처리된 그 픽셀 들을 받아오고 결과를 호출하는, PS_IN / PS_OUT 이라는 구조체로 되어있다. 정점 쉐이더 와 픽셀 쉐이더가 같이 있다고 보면 될 것 같다.

[3]. 정점 쉐이더가 하는 역할은,

[4]. 위의 역할이 끝나게 되면, VS_MAIN이라는 함수에서, VTXPOSTEX의 데이터를 받아와야 하므로, VS_IN / VS_OUT 이라는 같은 타입으로 (형식을 맞춰서) 별도의 사용자 정의 구조체를 선언해준다.

[5]. hlsl 파일에서는 C 언어의 문법이 동일하게 적용되지 않기 때문에, typedef 이라는, 것도 사용할 수 없고, _float 과 같은 사용자가 직접 정의해서 쓰는 자료형 타입은 사용할 수 없다. 그냥 float2 나, float4 같은 걸로 쓰는데 여기서 float4는 그냥 vector 와 같다고 보면 된다.

[6]. hlsl 의 특이점은, In.vPosition.xy 라고 x 와 y 를 같이 붙여서 쓸 수 있다는 이런 생소한 규칙들이 적용될 수 있다는 것.

[7]. 사용자가 쉐이더 파일에서, 구조체를 만들고, 선언하고 쓰고나서, 이 데이터들이 어떤 값을 의미하고, 어떤 용도로 사용되는지 DX가 자동적으로 알게끔 사용되는게 ‘’시멘틱’’이라고 불리는데, 다음과 같이 작성된다.

image.png

[8]. VS_IN 구조체를 만들었으면, VS_OUT 이라는 구조체도 만들어줘서, ‘’정점을 받고, 그 정점을 반환한다’’ 라는 구조가 완성되게끔 작성한다.

image.png

[9]. 이렇게 보면, 두 구조체가 같은데 그냥 통일해버리면 되지 않는가? 라는 생각이 드는데, 여기서 이제 행렬 변환 중, 투영행렬 변환에 대한 깊은 이해가 필요하다.

[10]. 흔히 행렬 변환을 하면서 월드 - 뷰 - 투영 순으로 행렬들을 곱하면서, 각각의 스페이스 영역을 구해왔는데, 투영행렬은 특히 ‘’이 투영행렬을 곱한다고 해서, 바로 투영 스페이스가 되는 것은 아니다!”

[11]. 투영행렬을 곱한 순간 까지는, 아직은 뷰 스페이스 영역에 남아있는데, 투영행렬을 곱한 것은, 다음 으로 옮기기 좋은 상태’로 만든 것 뿐이다.

[12]. 투영행렬을 곱하지 않고 그냥 투영을 진행하게 되면, 원래는 view 영역에 존재하는 정점들, x y z 를 z 나누기를 해야하지만, 그냥 진행하게 되면 오류가 발생하게 된다.

[13]. 하나는, FOV 즉, Field Of View 를 설정하기가 어려워지고, 쉽게 말해 카메라의 조절이 사용자 희망대로 어렵다는 것. 두 번 째로는 모든 z가 1이 되어버려서 z테스트, 즉 깊이 버퍼 테스트가 안되기 때문에, 그리기 순서에 대한 호출 순서를 심각하게 고민하는 상황이 오게 되버린다.