본문 바로가기
IT 기술/Direct3D

Direct3D 렌더링 파이프라인(IA 단계) part2_19일차

by 썬's 2023. 1. 28.

안녕하세요 보글리아입니다.

오늘부터 렌더링 파이프라인을 나가보겠습니다.

렌더링 파이프라인은 크게 IA->VS->RS->PS->OM 단계로 나뉩니다. 

사실 이 사이사이에 다른 단계도 있긴 하지만, 여러분들은 일단 이 5단계만 아시면 됩니다.

추가로 설명이 필요하다 생각하는 단계가 있다고 판단하면, 제가 설명하겠습니다.

※제 수업은 이전주차에서 배운 개념을 재차 설명하지 않습니다※

※본 내용에 들어가기 전 용어정의부터 하겠습니다※


용어정의

  • 정점(vertex) : 하나의 점
  • 색인(index) : 목차의 동의어로 컴퓨터 용어로는 어떤 데이터를 찾을 때, 그 데이터의 이름이나 위치 등에 대한 정보
  • 자료구조 : 컴퓨터에서 처리할 자료를 효율적으로 관리하고 구조화한 상태
  • 메시(mesh) : 하나의 객체로 이 메시는 모두 폴리곤(삼각형)으로 이루어져 있음.
  • 배열 : 동일한 성격의 데이터를 일정한 차례나 간격에 맞춰 나열한 형식

1. 렌더링 파이프라인 개요

Direct3D에서 모니터 상에 3차원 장면을 출력한다고 보겠습니다. 컴퓨터는 이 3차원 장면 모습에 근거해 2차원 이미지를 생성합니다. 

렌더링 파이프라인이란 모니터 상에 특정 객체를 출력하기 위한 일련의 단계라고 보시면 됩니다.

렌더링 파이프라인은 9단계나 되지만, 저희들은 반드시 알아야 하고 중요한 단계만 배우겠습니다.

렌더링 파이프라인
렌더링 파이프라인

 


2. 입력 조립기(IA) 단계

Direct3D의 렌더링 파이프라인 중 입력 조립기(input, assembler, IA) 단계는 정점들과 색인을 읽어서, 이 읽은 정보를 토대로 삼각형이나 선분 등의 도형을 조립합니다.

따라서 색인 정점이 있으면, 이 정점들을 가지고 어떤 식으로 조립해서 기본도형을 만들지 결정합니다.

IA 단계에서는 정점과 색인이 무엇인지 꼭 알고 가셔야 합니다.

 

정점

Direct3D에서 정점은 하나의 점입니다. 정점은 딱 하나만 있을 수 있고, 두 정점을 가지고 선분 하나를 만들 수도 있으며, 

삼각형을 보시면 하나의 정점을 삼각형의 두 변이 만나는 지점으로 볼 수 있습니다.

이렇게 보면 그냥 도형의 꼭짓점으로 보실 수 있지만, 실상은 더 많은 정보를 담습니다.

정점(vertex)
정점(vertex)

 

이러한 정점들은 정점 버퍼라는 자료구조 안에 담겨서 렌더링 파이프라인에 묶입니다.

자, 정점버퍼는 정점들을 모아둔 창고라고 보시면 됩니다. 그렇기에 정점버퍼로는 단순히 정점들이 모인 집합체이기 때문에 정점으로 삼각형을 만들지, 아니면 선분을 그을지 등을 결정할 수 없습니다.

 

이를 해결하기 위해 Direct3D에서 기본도형 위상구조(primitive topology)를 제공합니다. 기본도형 위상구조는 D3D11_PRIMITIVE_TOPOLOGY를 사용해 정점을 다양한 방식으로 사용할 수 있습니다.

이 수단을 사용해 정점버퍼를 가지고 특정 도형이나 선분을 만들 수 있습니다.

typedf enum D3D11_PRIMITIVE_TOPOLOGY
{
  D3D11_PRIMITIVR_TOPOLOGY_UNDEFINED = 0;
  D3D11_PRIMITIVR_TOPOLOGY_POINTLIST = 1; // 정점 하나
  D3D11_PRIMITIVR_TOPOLOGY_LINELIST = 2; // 선분
  D3D11_PRIMITIVR_TOPOLOGY_LINESTRIP = 3; // 두 개의 선분 이음
  D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4; // 삼각형
  .
  .
  .
  .
}D3D11_PRIMITIVE_TOPLOGY_LINELIST

Direct3D에서 정점버퍼 내 정점을 사용할 때, 가장 많이 쓰이는게 하단의 네 개의 위상구조입니다.

각각 정점을 어떻게 사용할지 보여주며, 이 외에도 많은 위상구조가 있습니다.

  • POINTLIST : 정점을 하나만 사용합니다.
  • LINELIST : 정점을 두 개 사용해 이를 이어 선분을 만듭니다.
  • LINESTRIP : 정점 세 개를 선분으로 이읍니다. 선분들이 자동으로 연결됩니다.
  • TRIANGLELIST : 삼각형 하나를 만듭니다.

이 위상구조를 한 번 설정하면 다음 모든 도형 그리고 호출에서 설정한 위상구조가 적용됩니다.

primitive topology
primitive topology

색인

Direct3D에서 메시를 이루고 있는 도형은 삼각형이라고 이전 시간에 저희는 배웠습니다.

자 그럼 예를 들어 사각형을 만든다고 해보겠습니다. 사각형은 Direct3D에서 Quad라 합니다.

이 Quad를 구현하기 위해서는 정점이 몇 개 필요하고 삼각형은 몇 개가 있어야 할까요?? 정답은 정점 4개와 삼각형 2개가 필요합니다.

 

하단 코드를 보시면 정점은 v0, v1, v2, v3 총 네 개입니다. 그리고 삼각형이 그려지는 공식이 있습니다. 삼각형은 그릴 때 시계방향으로 그립니다.

 

자 하단 이미지를 잘 보시기 바랍니다.

일단 사각형을 만들기 위해 삼각형 하나를 먼저 만들겠습니다. 삼각형은 시계방향으로 그린다 했으니, v0에서 v1 정점으로 선분이 하나 만들어지고, v1에서 v2로가 선분이 또 하나 만들어진 다음 v2에서 v0으로 가 마지막 선분이 만들어져 삼각형 하나가 완성이 됩니다.

두 번째 삼각형은 첫 번째 삼각형이 완성된 마지막 정점에서 그리기 시작합니다. 그렇기에 하단 코드와 같이 v2부터 시작합니다. v2에서 시계방향인 v1로 선분이 만들어지고 v1에서 v3, 마지막으로 v3에서 v2로 가 두 번째 삼각형이 만들어진 결과, 두  삼각형이 겹쳐진 하나의 quad 메시가 만들어졌습니다.

Vertex quad[6] =
{
  v0, v1, v2, // 삼각형 1
  v2, v1, v3, // 삼각형 2
}

삼각형 그리는 순서
삼각형 그리는 순서

Direct3D에서 삼각형을 만들 때 정점이 두 개가 공유합니다.

상단에 예시를 들 때 삼각형 두 개를 만드는데 v2 정점이 공유되는 것이 보이실 것입니다.

하지만 삼각형과 같이 단순한 도형을 만드는데 정점을 공유하는 것은 큰 문제가 되지 않지만, 만약 팔각형, 혹은 비행기나 게임 캐릭터와 같은 엄청나게 많은 삼각형이 필요한 메시는 그 만큼 공유할 정점이 많겠죠?? 이러면 문제가 됩니다.

 

메시에서 정점을 공유하면 다음과 같은 문제가 발생합니다.

  1. 응용 프로그램에서 요구하는 메모리 요구량 증가
  2. 그래픽 하드웨어 처리량 증가

즉, 굳이 같은 정점 자료를 여러 번 저장해 메모리를 크게 잡을 필요가 있는가?

아니면 같은 정점 자료를 여러 번 처리해 그래픽 하드웨어의 처리량을 증가시켜 무리를 줄 필요가 있는가?

이 두 문제가 발생합니다.

 

따라서 삼각형 목록에서 중복되는 정점을 제거하는 방법이 필요합니다.

해법은 바로 색인(index)을 사용합니다. 즉 v0, v1, v2, v3과 같은 정점들이 중복되지 못하게 고유한 정점들로 취급하기 위해 목록을 만들고 이 정점들은 어떤 순서를 가지고 삼각형을 형성할 지 정점들의 색인을 적절히 나열해서 지정하면 됩니다.

 

하단 코드를 보시면 먼저 정점 4개를 배열을 사용해 색인으로 생성했습니다.

그렇기에 그래픽 카드는 정점 목록의 고유한 4개의 정점들을 처리한 후, 이를 이용해 삼각형을 형성합니다.

즉, 상단 코드처럼 정점이 중복 되지 않는 대신, 색인 중복이 발생했지만, 상단 코드와 하나의 사각형을 생성하기 위해 정점들을 공유한 것보다, 훨씬 더 메모리를 덜 차지하고 처리량도 적습니다.

Vertex V[4] = {v0, v1, v2, v3); 정점 색인(index) 생성

UINT indexList[6] = 
{0, 1, 2,  // 삼격형 1
 2, 1, 3}; // 삼각형 2

 


오늘은 Direct3D의 렌더링 파이프라인 중 IA단계를 알아봤습니다.

다음 시간에는 VS단계에 대해 배워보도록 하겠습니다.

긴 글 읽으시느라 너무 고생 많으셨고 좋은 하루 보내시기 바랍니다~~

댓글