C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 5. Rendering Pipeline - Vertex Shader (VS)

GameChoi 2023. 6. 13. 17:34

1. Rendering Pipeline

1.1 Vertex Shader

 - 입력 조립기 단계에서 기본 도형들을 조립한 후 정점들이 정점 셰이더 단계로 입력

   - 정점 하나를 받아 정점 하나를 출력하는 함수, 화면에 그려질 모든 정점은 정점 셰이더 단계를 거침

   - 프로그래머가 구현하여 GPU로 제출, 그 함수는 각 정점에 대해 GPU에서 실행되므로 아주 빠름

     - 변환, 조명, 변위 매핑 등 수많은 특수 효과를 정점 셰이더에서 수행 가능

       - 입력 정점 자료, Texture, 변환 행렬, 장면 광원 정보 등 GPU 메모리에 담긴 다른 자료에도 접근 가능

1.1.1 Local Space & World Space

 - 물체의 기하구조를 장면 전역의 좌표계를 기준으로 직접 구축하는 것이 아님

   - 물체 자신의 Local Space를 기준으로 구축하면 좌표계 원점을 중심 가까이 둘 수 있고 좌표 축들을 물체에 맞게 정렬

     - 물체 자신의 공간에서 3차원 모형의 정점들을 모두 정의했다면 세계 공간의 관계를 정의

       - World Space 기준으로 한 Local Space 원점과 축들의 위치 및 방향 지정, 그에 해당하는 좌표 변경 변환 수행

1.1.2 Camera(View) Space

 - 최종적으로 화면에 표시되는 것은 장면의 2차원 이미지이므로 장면에 가상의 카메라를 배치

   - 세계에서 관찰자가 볼 수 있는 영역,, 세계에서 2차원 이미지를 생성해야 하는 영역을 결정

     - 카메라에 Local Space 영역을 생성하면 좌표계가 Camera Space

 - 밑의 함수를 통해 World Space의 시야 행렬을 계산 & 카메라의 Local Space 영역에서 역행렬을 통해 구할 수 있음

XMMATRIX XMMatrixLookAtLH (
FXMVECTOR EyePosition,   // 입력카메라위치
FXMVECTOR FocusPosition, // 입력 대상점
FXMVECTOR UpDirection) ; // 입력 세계 상향 벡터

1.1.3 투영과 동차 절단 공간

 - 카메라가 바라보는 공간 영역 (절두체 - 끝이 잘린 사각뿔)

   - 시야 절두체 안의 3차원 기하구조를 2차원 투영 창으로 투영

     - 물체의 3차원 깊이가 증가함에 따라 그 투영의 크기가 줄어드는 형상이 나타남 (Perspective Projection)

 - XMA Math 라이브러리를 통해 원근 투영 행렬을 구축해 주는 함수를 제공

XMMATRIX XMMatrixPerspectiveFovLH (
FLOAT FovAngleY, // 수직 시이각 ( 라디안 단위)
FLOAT AspectRatio, // 비 = 너비 / 높이
FLOAT NearZ, // 가까운평면까지의 거리
FLOAT FarZ) ; // 먼 평면까지의 거리

   - 응용 프로그램 창의 너비와 높이를 이용하여 종횡비를 계산하고 수직 시야각, 평면의 거리를 구해 값을 넣음

XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathX::Pi, AspectRatio(), l.Of, 1000.Of);