IA 단계에서 각 정점들의 정보와 그림을 그리는 방법에 대해서 저장한 버퍼를 생성해서 결과물을 만들었다.
그렇다면 이후에는 이 결과물을 다음 단계인 VS 단계로 넘겨주어야 한다.
하지만 바로 넘겨주게 되면 VS에선 이 결과물을 제대로 읽어들이지 못한다.
hlsl로 작성한 VS 단계에 입력되는 매개변수의 자료형이다.
그리고 우리가 IA 단계에서 입력한 VertexBuffer에는 정점의 정보가 담겨 있다.
이 정점의 정보를 VS에서 읽어들일 수 있게 변화를 해주어야 한다.
이때 IA에서 바인딩되어야 하는 정보가 바로 InputLayout이다. 이 안에는 VS가 읽어들일 수 있는 정보로 자료를 구분해주는 역할을 한다.
위에 VertexInput 내부에 float4 자료형으로 선언된 변수들이 실제 VS 단계에서 입력 받는 변수들이다. InputLayout을 통해 기존 VertexBuffer에 입력된 정점 정보들을 저 정보로 읽어 들일 수 있게 해주는 작업을 거친다.
position : POSITION0; 에서 뒤에 입력되어 있는 것들은 시멘틱이라 하여 식별 코드의 기능을 한다. 입력 받는 0번 자료들은 POSITION이라고 명명된 float4 position에 값이 넘겨진다.
이 값은 입력 받은 메모리 덩어리의 첫 번째 부분, 즉 0번부터 시작해서 총 3개의 32비트 float 자료를 읽어들인다.
내가 VertexPC라는 정점 구조체에는 Vector3로 선언된 position 값이 저장된다. 즉 3개의 float을 값으로 가지는 것이니 Layout은 올바른 자료를 읽어들일 수 있게 된다.
이를 VS를 위해 자료를 입력해주게 되면 다음과 같은 함수가 작동을 한다.
여기서 문제가 하나 발생하는데, 입력 받은 정점들의 정보는 가지고 있다. 그렇다면 저기 WVP와 color은 어디서 받아오는 것일까?
이는 현재 작성해놓은 GameObject 내부에 저 값들을 넘겨 주는 버퍼를 작성해두었다.
빌드가 되고 프로그램이 시작되면 진입점을 통해서 실행을 하게 되고 다음으로 작성되는 것이 바로 GameObject의 CreateStaticMember를 작성하는 것이다.
이 내부에 WVPBuffer와 colorBuffer가 있고 여기서 두 버퍼를 작성한다.
하지만 이 버퍼는 현재 값을 가지고 있지 않다. 실제로 값을 넘겨주는 것은 런타임 도중 WVP가 갱신되는 부분이다. 이 W는 Update에서 갱신이 되지만 뒤의 VP는 카메라의 행렬이기 때문에 Render 함수가 작동을 할 때 갱신이 된다.
Render 함수가 작동되어 카메라의 행렬까지 갱신이 완료되면 최종적으로 WVP 값이 완료가 된다. 하지만 이를 바로 GPU에 넘겨 줄 수가 없다.
현재 WVPBuffer와 colorBuffer는 D3D11_USAGE_DYNAMIC으로 바인딩 되어 있다. CPU는 작성을 할 수 있고 GPU는 값을 읽어들일 수 있다.
하지만 CPU가 작성을 하는 도중에 GPU가 값을 읽어들이면 원하는 값을 줄 수가 없어서 SubResource라는 중간 다리를 만들어 거기에 값을 저장해두어야 한다.
이 경우 마찬가지의 이유료 Map 함수를 이용해 잠시 버퍼를 읽을 수 없게 잠궈두었다가 값을 입력하고 이후에 UnMap을 이용해 잠금을 해제하여 GPU가 값을 읽어들일 수 있게 하면 된다.
다시 위의 VS 단계를 확인하면 성공적으로 위치 변환을 할 수 있게 된다. 하지만 color 값을 입력 받은 뒤 그 값에 * 2 - 1을 하게 되는데 이 이유는 무엇일까?
Color는 벡터다. 색은 합하게 되면 섞이는 값이 되지만 벡터는 그냥 값이 덮어씌워지게 된다. 이를 방지하기 위해 양수만 존재하는 값을 음수의 영역까지 포함하게 하여 값이 그냥 덮어지는 것을 방지한다.
가령 R의 값에 0.5를 넣게 되면 어떻게 될까?
현재 사각형의 정점에는 왼쪽 꼭짓점에는 0,0,0의 값이 들어가 있고 오른쪽 꼭짓점에는 1,1,1이 들어가 있다. 검은색과 흰색이다.
이 사각형에 0.5,0,0의 색을 입히게 되면 기존 정점의 값에 추가한 0.5,0,0의 값이 더해지는데 그 전에 *2 - 1이 되면 추가되는 값은 0,-1,-1이 된다.
이렇게 하면 정점의 색은 왼쪽 꼭짓점이 0,-1,-1이 되고 오른쪽 꼭짓점은 1,0,0이 된다.
이후 밑의 saturate 함수를 통해 0 보다 작은 값은 0으로, 1보다 큰 값은 1로 통일이 된다.
결과적으로 왼쪽은 0,0,0 오른쪽은 1,0,0이 되어 검은색에서 빨간색으로 변하는 색을 가진 사각형이 완성되게 된다.
이를 통해 일단은 VS 단계가 끝이나고 이 결과값이 output으로 되어 PS로 넘어가게 된다.
'프로그래밍 > 공부' 카테고리의 다른 글
[Game] 충돌 (2) (0) | 2023.01.16 |
---|---|
[Game] 충돌 (0) | 2023.01.13 |
[DirectX] 셰이더(Shader) (0) | 2023.01.04 |
[DirectX] 렌더링 파이프라인 - (1) (0) | 2023.01.04 |
[Game] 각도와 방향 (0) | 2023.01.01 |
댓글