(그래픽스) 렌더링 파이프라인
3차원으로 만들어진 3D 모델 데이터들을 2차원(모니터)으로 투영(바꾸는)하는 과정의
프로세스를 자세하게 표현한 것이다
랜더링 파이프라인의 핵심 단계
1. 정점 데이터 처리 단계
2. 레스터라이저 단계
3. 픽셀 or 프래그먼트(fragment) 단계
4. 출력 or 병합 단계
1. 정점 단계
3차 > 2차 변환하는 단계
2. 레스터라이저 단계
도형의 보이지 않는 부분을 처리한다거나
해상도에 맞는 픽셀을 처리한다거나
3. 픽셀 쉐이더 단계
픽셀을 하나씩 다 정리하는 단계
4. 출력 단계
알파값 등을 고려해 출력
마지막으로 DX에선 렌더 타겟 (OpenGL에서는 프레임 버퍼)을 진행한다
Wapi에서 BackDC에 그려준 그런 단계와 같다
3차원 모델 하나를 2차원 세상에 그리기 위해 가장 먼저 해야 할 일은?
하드디스크와 같은 저장소에 있는 데이터를 램에 들고 와서
램에 있는 데이터를 DX에 넘겨줘야 한다
램에 있는 데이터의 모델 정보를 그래픽카드(GPU) 메모리 영역으로 복사해서 넘겨줘야 한다
여기서 모델은 폴리곤(점의 집합)을 의미한다
주로 하나의 사각형을 삼각형 폴리곤 두 개로 3D물체를 정의한다
Vertex Buffer
램에 있는 데이터를 GPU의 공간인 버퍼에 보내는데
램에서는 정점 데이터를 Vertex라 부르고
GPU에서는 그 데이터 구조를 Vertex Buffer라고 부른다
정점들을 운반하는 자료구조를 Vertex Buffer라고 한다
Index Buffer
정점버퍼와 함께 등장하는 용어로 Index Buffer가 있는데
단순한 사각형 하나는 삼각형 두 개니 정점이 6개가 필요하다
그런데 Index Buffer를 사용하면,
중복되는 정점 2개 데이터가 낭비되고 정점 작업도 낭비되니
(단순한 사각형 하나는 메모리 2개 낭비지만, 더 많아지면 n배 이상의 낭비)
정점 데이터를 4개만 두고 그리는 순서를 따로 저장하면 효율적으로 관리가 가능하다
모델 만들어 주시는 분이 그리는 순서를 정해주신다
0112121110 이런 식으로 나오면 우리는 for문을 돌려서 읽어주면 된다
인덱스 버퍼는 정점들의 인덱스를 저장하고 있는 버퍼이며
vertex buffer[] = {p0, p1, p2, p3}; 4개의 정점 데이터
index buffer[] = {0,1,2,1,3};
하나의 점 좌표가 4바이트 정수이고 좌표만 생각하면 총 12바이트가 필요하며
인덱스 버퍼를 사용하는 것도 결국 메모리를 사용하니 큰 차이가 없다고 생각할 수 있지만,
좌표뿐 아니라 수많은 속성과 특성을 가질 수 있고
ex. 방향정보(면에서 수직으로 올라가는 방향)를 추가하면 조명과의 위치로 빛 계산이 가능해짐
정점 위치 데이터 말고도 색깔, 법선(위에서 말한 방향, Normal), UV 등 프로그래머가 원하는
데이터를 추가하여 사용 가능하기 때문에
단순하게 정수만 저장하는 인덱스 버퍼가 훨씬 메모리적으로 효율적이다
이처럼 정점을 어떤 순서로 그려야 하는지 알려주는 목록을 제공하면
위에서 설명한 메모리낭비, 연산량 증가를 해결할 수 있다
정점버퍼와 Primitive Topology
정점버퍼는 정점들의 연속적인 메모리에 저장하는 자료구조에 불과하기 때문에 실제로
gpu에서 이러한 정점들을 이용해 어떤 도형을 만들어야 하는지 정보가 필요하다
해당 도형 정보를 Directx 3D에서는 Primitive Topology라고 한다
대표적으로 point list, line list, triangle strip, triangle list 등이 있다
Input Assembler
Input Assembler(입력 조립기) 단계에서는 이러한 정점들을 읽어서 삼각형과 같은
도형으로 조립하는 단계의 일을 한다.
Vertex Shader
Vertex Shader Stage~ Geometry Shader까지의 부분을
정점버퍼를 끝내고 하는 Vertex Shader라고 부름
Input Assembler에서 받은 정점 정보들로 도형이 생성되었지만
로컬좌표계 기준이기에 해당 데이터를 모두 화면에 출력하면 여러 가지 도형들이 겹쳐지기에
공간좌표계(World)로 변환할 필요가 있다
Local Space > World Space로 변환하고
카메라라는 개념이 필요하니
실제 플레이어가 바라보는 카메라 중심이 되는 공간인
View Space로도 변환을 해야 한다
그리고 3d의 경우는 마지막으로 원근감을 표현하기 위해 Projection을 거쳐
최종적으로 정의된 Clip Space(추후 Projection 행렬 배우면서 설명 예정) 공간으로 변환해 준다
'그래픽스 > [기초] DirectX' 카테고리의 다른 글
[DirectX Note] 랜더링 파이프라인 (2) (0) | 2023.05.22 |
---|---|
[DirectX Note] 애플리케이션 생성과 정적 라이브러리 추가 (0) | 2023.05.17 |
[DirectX Note] 그래픽스 공부 이유 (0) | 2023.05.17 |