본문 바로가기
IT 기술/Direct3D

Direct3D 렌더링 파이프라인(VS 단계 1부) part2_20일차

by 썬's 2023. 1. 29.

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

저번 시간에는 렌더링 파이프라인의 단계 중 하나인 IA 단계를 배워 봤는데요

이번 시간에는 렌더링 파이프라인의 VS 단계를 알아보겠습니다.

VS 단계는 조금 설명할게 많기 때문에 이 단계는 part별로 나눠 설명하겠습니다.

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

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


용어정의

  • 정점(vertex) : 하나의 점 
  • 객체(오브젝트) : 고형의 물체인 비행기나 큐브 등의 물체
  • 단위행렬 : 주대각 성분은 1이고 나머지 성분은 모두 0인 정방행렬(자세한 사항은 6일 차 참조)

1. 정점 셰이더(VS) 단계

Direct3D의 렌더링 파이프라인 중 정점 셰이더(VS) 단계는 IA 단계에서 정점을 가지고 기본도형을 만들고 나면, 이러한 도형을 이루는 정점들을 받아 이 정점 하나하나를 출력하는 함수를 만든다고 보시면 됩니다. 화면상에 그려질 모든 정점들은 반드시 이 VS 단계를 거쳐야 합니다.

프로그래머는 이 VS 함수의 구체적인 내용을 직접 구현해서 GPU에 제출합니다.

이 GPU에서 VS 함수 내 각 정점들이 구현됩니다.

 

VS 단계에서는 변환, 조명, 번위 매핑 등의 무수히 많은 특수 효과를 설정할 수 있습니다.

일단 이 하나하나를 제가 설명해 드리기 앞서 세계 공간(world space)와 국소 공간(local space)을 설명하겠습니다.

 


1.1 세계 공간과 국소 공간

Direct3D의 3차원 화면 상에서 특정 객체를 생성하거나 특수효과를 넣을 때는 세계 공간과(wolrd space) 국소 공간(local space)을 구분하실 줄 알아야 합니다. 편의상 세계 공간은 월드좌표, 국소 공간은 지역좌표라 하겠습니다.

예를 들어 객체 하나를 만든다고 할 때, 이 객체는 월드좌표계를 기준으로 직접 만드는게 아닌, 객체 자신의 지역좌표계를 기준으로 객체를 만듭니다. 

  • 월드좌표 : 3차원 장면 전역 좌표계
  • 지역좌표 : 물체 자신이 가지고 있는 국소 좌표계

즉 정리하면 월드좌표는 화면상에 전체 x, y, z 축으로 이루어진 공간 좌표이고

지역좌표는 특정 객체(물체)가 있을 때, 이 객체 자신을 중심으로 하는 공간 좌표입니다. 지역좌표 역시 x, y, z 축으로 이루어져 있습니다.

이해를 돕기위해 하단 그림을 보시면 월드좌표 = 화면 모니터라고 보시면 됩니다.

이 모니터 안에 큐브를 생성한다고 할 때, 이 큐브라는 객체는 고유의 좌표인 지역좌표를 가집니다. 큐브는 자신만의 좌표계에 따라 x축으로 큐브를 늘리거나 y축 방향으로 큐브를 회전하는 등의 특수효과를 설정할 수 있습니다.

세계 공간, 국소 공간
세계 공간, 국소 공간

 

자 다시 예를 들어 3차원 좌표계(x, y, z)로 이루어진 공간 상에 공항을 만들고 그 공항 철도 위에 비행기와 관제탑을 만든다고 해보겠습니다. 그럼 일단 만약 공항을 월드좌표에 만든다고 하면 공항을 만든 다음 월드좌표를 차지하는 공항 위에 따로 비행기와 관제탑을 지역좌표로 넣고 싶은 곳에 놔서 비행기와 관제탑이라는 객체를 만들 수 있습니다.

 

이러한 지역좌표에서 작업을 하면 객체의 중심에 좌표계 원점을 두고 이 좌표축들에 맞춰 객체를 원하는데로 꾸밀 수 있습니다. 수많은 객체들의 지역좌표를 설정한 다음, 이를 월드좌표상에 알맞은 위치에 배치하시면 됩니다.

 

Direct3D에서 월드좌표와 지역좌표에 대한 관계를 꼭!! 알아두셔야 합니다.

그리고 그 다음 단계로 하셔야 할 것이 있습니다.

월드좌표를 기준으로 한 지역좌표계의 원점과 축들의 위치와 방향을 지정하고, 그에 해당하는 좌표 변경 변환을 하셔야 합니다. 즉 쉽게 말해 지역좌표계를 월드좌표계를 기준으로 바꾸셔야 합니다.

 

즉, 저희가 초창기에 왼손좌표계와 오른손 좌표계를 말씀드렸는데, Direct3D는 왼손좌표계를 사용합니다.

만약 월드좌표의 좌표계가 왼손좌표계를 기준으로 하면 지역좌표의 좌표계도 왼손좌표계를 기준으로 설정하셔야 합니다.

지역좌표계 기준의 좌표를 월드좌표계로 변경하는 것을 세계 변환(world transform)이라 부르고, 해당 변환 행렬을 세계 행렬(world matrix)라 부릅니다.

 

자 하단에 이미지를 보시면, 오른쪽 이미지에 View System이라는게 있습니다. 이는 우리가 바라보는 시점, 즉 모니터를 바라보는 저희 자신입니다. 그리고 이 모니터는 월드좌표로 구성돼 있고 그 안에 다양한 도형들인 객체들이 왼쪽 이미지를 보시는 것처럼 각각의 지역좌표계를 가집니다. 이들 객체 안에 지역좌표계를 설정했다면, 이를 월드좌표에 맞춰 좌표계를 변환해주셔야 합니다.

 

본인이 특정 객체의 지역좌표계를 월드좌표에 따르지 않고 직접 정의하고 싶으시다면, 그 객체의 세계 행렬을 단위행렬로 설정하시면 됩니다.

세계 변환
세계 변환

 

이제 마지막으로 각 객체들을 지역좌표계에 정의하면 생기는 장점을 알아보겠습니다.

  1. 객체 내 중심에 지역좌표계가 오기 때문에 월드좌표계보다 더 쉽게 객체를 다룰 수 있습니다.
  2. 여러 개 장면에서 객체를 재사용하는 경우, 각 장면마다 객체의 지역좌표계를 해당 워드좌표계로 적절히 변환하는 행렬을 사용할 수 있습니다.
  3. 한 장면에서 하나의 객체의 위치나, 방향을 달리해서 여러 번 그리는 경우, 객체의 지역좌표를 기준으로 한 정점 목록과 색인 목록을 가진 복사본 하나를 만들어 두면, 객체를 여러 번 그릴 때 이 복사본을 가지고 각 객체마다 위치나 방향 등의 설정을 다루게 해서 그릴 수 있습니다. 이러한 기법을 인스턴싱(instanceing)이라고 합니다.

자 추가적인 설명을 하면, 하단 그림에서 1번 장점을 보시면 case 1은 객체를 중심으로 지역좌표계를 설정한 것이고 case 2는 객체가 월드좌표를 따른 것입니다. 만약 여러분들이 큐브를 x축 방향으로 늘린다고 하시면 어떤 게 더 편하실까요?? ㅎㅎ 아마 case 1일 것입니다. 

 

그리고 인스턴싱은 아주아주 중요한 개념으로 꼭 알아두셔야 합니다. 

인스턴싱을 정의하면 객체를 한 화면에서 여러 번 렌더링(생성)하는 경우 처리하는 방식입니다.

 


오늘은 Direct3D의 렌더링 파이프라인 중 VS 단계에서 중요한 개념인 세계 공간과 국소 공간에 대해 알아봤습니다.

그럼 다음 시간에는 VS 단계에 추가적인 개념인 시야 공간을 배우겠습니다.

긴 글 읽으시느라 고생 너무너무 많으셨습니다~~

댓글