본문 바로가기
그래픽스ㆍDirectX

렌더링 파이프라인 - 그래픽스 API 초기화와 드로우 콜

by imagineer_jinny 2022. 5. 20.

유니티 셰이더&렌더링 에센스 E02 : 렌더링 파이프라인 (1/2) - 그래픽스 API 초기화와 드로우 콜 - YouTube

 

렌더링 파이프라인 - 그래픽스 API 초기화

 

렌더링 파이프라인

오브젝트를 화면에 표현하기 위한 일련의 작업들

 

 

 

이러한 렌더링 파이프라인을 구성할 수 있도록 그래픽스 API에서 어떤 처리를 먼저 시작해야하는지 알아보자

 

 

무언가를 그리기 위해서는 렌더링 파이프라인을 구성하기 전에 가장 먼저 그래픽스 API를 초기화해야한다.

렌더링 파이프라인이 실행되기 전에 먼저 최초 한번은 실행되야 하는 이 과정은

GPU에게 명령을 전달할 수단을 만들고 사용할 셰이더를 셋업 하는 단계임

그래픽스 API 초기화 단계는 대부분의 과정이 CPU에서 일어나게 됨

 

 

1. GPU 디바이스 생성

- 현재 기기의 GPU를 표현하는 오브젝트

- 한번만 생성, 하나만 존재

- 커맨드 큐로부터 커맨드를 받아들여 실행

커맨드 큐: GPU에게 전달할 명령, 즉 커맨드를 쌓아두는 곳

 

2. 커맨드 큐 생성

커맨드 큐가 필요한 이유? CPU와 GPU는 직접 통신하지 않기 때문

 

커맨드 큐의 동작

각각의 커맨드들은 GPU에게 전달할 데이터 또는 GPU에서 실행할 명령을 표현

CPU는 실행할 명령들을 담아놓은 커맨드 버퍼를 커맨드 큐에 계속 쌓게 됨

그리고 커맨드 큐에 쌓인 커맨드 버퍼는 먼저 쌓인 순서대로 GPU가 가능할때마다 계속해서 빼가게 됨

이 과정에서 커맨드 버퍼의 커맨드들은 GPU가 이해할 수 있는 하드웨어 언어로 번역되서 GPU에 전달되게 됨

 

이 과정에서 버퍼에 쌓인 명령이 나중에 실행되게 되면 명령이 품고 있던 데이터들은 

시스템 메모리 RAM에서 GPU의 전용 메모리인 VRAM에서 복제되서 전달하게 됨

사용할 텍스쳐나 모델의 정점들, 사용할 셰이더들이 시스템 메모리에서 GPU로 업로드됨

 

3. 렌더링 파이프라인 상태 생성

- 렌더링 파이프라인의 상태 표현

- 렌더링 파이프라인에 사용할 속성들을 가짐

- 여러개 생성 가능 (오브젝트마다 다른 렌더링 파이프라인을 적용할 수 있음)

렌더링 파이프라인 서술자: 렌더링 파이프라인이 어떤식으로 동작할지를 묘사하는 오브젝트

 

 

4. 사용할 데이터 로드

- 사용할 데이터를 미리 메모리에 로드

- RAM에서 VRAM으로 전송될 데이터

 

정점들이 갖고 있는 값들을 정점 속성이라고 부름

 

 

오브젝트의 이러한 정점 데이터들은 셰이더 안에서는 구조체 형태로 다루게 될 것이지만,

커맨드를 통해 RAM에서 GPU로 데이터가 전달될 때는 스트림 형태의 버퍼로 전달되게 됨

즉 데이터의 앞,뒤 구분이나 구조화된 단위 없이 그냥 일렬로 데이터가 GPU로 들어온다는 뜻

 

나중에 정점 조립기의 정점 서술자를 통해 프로그래머가 원하는 구조로 다시 정점으로 구조화하게 됨

 

렌더링 파이프라인 - 드로우콜 생성

드로우콜 생성: 렌더링 파이프라인이 시작되기 직전의 단계

1. 드로우 콜 생성

- 커맨드 버퍼에 GPU에 전달할 명령을 추가

 

드로우 콜: 오브젝트를 한번 그리는데 필요한 명령들의 묶음

 

드로우 콜은 CPU에서 실행되는 단계인데 여기서는 삼각형을 그리기 위해 삼각형을 표현하는 데이터들과 삼각형을 그리기 위한 명령을 커맨드 버퍼에 추가함

이렇게 삼각형을 한번 그리기 위한 커맨드의 하나의 묶음이 하나의 드로우 콜이 됨

그리고 커맨드 버퍼는 커맨드 큐에 쌓이게 되고 GPU로 전달되어 처리됨

댓글