본문 바로가기
IT 기술/Direct3D

Direct3D 렌더링 파이프라인 part1_18일차

by 썬's 2023. 1. 27.

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

저번 시간부로 Direct3D의 초기화 작업을 마무리했습니다.

이번 시간에는 렌더링 파이프라인에 대해 들어가기 전 알아두셔야 할 개념을 배워 보도록 하겠습니다.

이 부분도 Direct3D의 중요한 부분이기 때문에 꼭 알아두셔야 하고 역시나 중요한 만큼 설명한 부분이 좀 많은 이유로 

part별로 나눠서 진행하겠습니다.

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

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


용어정의

  • 정점(vertex) : 하나의 점
  • 폴리곤(polygon) : 삼각형의 동의어로 정점 새 개로 이루어진 형태
  • 메시(mesh) : 폴리곤들의 집합체로, 폴리곤이 모인 하나의 객체
  • 객체 : 오브젝트 또는 물체로 보시면 됩니다.

정점, 폴리곤, 메시
정점, 폴리곤, 메시

1. Direct3D 물체 표현 방식

Direct3D 응용 프로그램에서 3차원 물체는 모두 폴리곤으로 이루어진 메시(mesh)로 표현합니다.

여기서 예를 들면 고형의 3차원 물체인 큐브가 있다고 하겠습니다.

이 큐브를 Direct3D에서 표현하려면 폴리곤이 모여 만들어집니다. 거의 모든 3차원 물체는 메시로 표현된다고 보시면 됩니다. 여러분들이 게임 상에서 볼 수 있는 캐릭터나 몬스터 모두 삼각형 메시로 이루어져 있습니다.

 

하단 이미지를 보시면 3차원 도형이 모두 삼각형으로 이루어진 것을 보실 수 있습니다.

마찬가지로 오른쪽의 돌고래도 삼각형 메시로 이루어져 있습니다.

즉 메시란 삼각형(폴리곤)들로 이루진 하나의 객체라고 보시면 됩니다.

메시 설명메시 설명
메시 설명

 


2. Direct3D 색상 표현(RGBA)

Direct3D에서 객체의 색상을 표현하려면 객체의 각 픽셀마다 RGB(빨강, 녹색, 청색)의 조합으로 색상을 표기합니다.

이러한 RGB 각 색상들의 빛 세기를 조절해 다양한 색상을 나타낼 수 있습니다. 빛의 세기는 최솟값인 0부터 최댓값인 1로 조절할 수 있습니다.

예를 들어 하나의 색상이 (0.34, 0.67, 0.98)의 빛의 세기를 띈다면, 빨강은 34%, 녹색은 67%, 청색은 98%의 빛의 세기를 띠는 색상을 나타내게 됩니다.

제가 그림판에 해보니 어두운 네이비색?이 나오네요 ㅎㅎ 아무래도 청색의 빛의 세기가 크다보니 그 계열로 나왔나봅니다.

 

하나의 색상을 (r, g, b)로 빛의 세기를 표현하는 것을 색상 벡터라 합니다.

이러한 색상 벡터끼리는 더해서 새로운 색상을 나타낼 수 있습니다.

예를 들어 두 색상 벡터인 (0.2, 0.34, 0.22)와 (0.3, 0.21, 0.35)를 더해 새로운 색상 벡터인 (0.5, 0.56, 0.57)이 나옵니다.

역시 덧셈도 가능하니 뺄셈가 스칼라 곱셈도 가능합니다.

 

여기서 의문이 들 수 있는데요. 그럼 두 색상 벡터에서 각 rgb가 대응하는 성분끼리 더하거나 뺏는데 빛의 최솟값인 0보다 작거나 최댓값인 1보다 크면 어떻게 될까요??

정답은 최솟값인 0과 최댓값인 1에 한정시켜야  합니다.

만약 두 색상 벡터를 더한 결과 값인 (1.1, 0.2, 0.34)라면 1.1은 최댓값인 1만큼의 센 빛이어야 하며, 1.1을 1로 적용해야 합니다. 마찬가지로 뺀 결과 값인 (0.24, -0.2, 0.25)라면 -0.2는 최솟값인 0만큼의 약한 빛이어야 하며, 0으로 적용합니다.

 

자 지금까지 RGB 색상을 알아봤습니다. 그럼 A는 뭘까요? A는 알파(Alpha)라 부르는 색상 성분으로 주로 색상의 불투명도를 나타낼 때 사용합니다. 알파 성분을 추가하면 색상은 4차원 벡터가 됩니다.

이전에는 RGB만 사용해서 3차원 벡터, 그리고 알파 성분까지 추가하면 RGBA, 즉 (r, g, b, a)가 돼서 4차원 벡터가 됩니다.

 


3. Direct3D 색상 비트

 

Direct3D에서 색상에 관해 추가적으로 설명드릴게 각 성분인 r, g, b, a는 각각 32비트 부동소수점 값으로 표현합니다.

각각 32비트라 합치면 128비트로 하나의 색상을 표현합니다.

상단에 색상 벡터의 예를 들 때 소수점으로 rgb 색상을 표현한 방식이 부동소수점 방식입니다.

 

그런데 각 성분(RGB)마다 32비트면 너무 많습니다. 각 성분에 32비트 대신 8비트(1바이트)로 할당해 총 32비트로 색상을 표현할 수도 있습니다. 8비트는 총 256가지의 빛의 세기를 표현할 수 있습니다. 

즉, 한 성분에 대해 255가지의 세기를 표현할 수 있는데 0은 세기가 없어 제외하면 1이 빛의 최소 세기고 255가 빛의 최대 세기라 보시면 됩니다. 

 

각 RGB 색상당 8비트를 주면 색상의 세기는 256 x 256 x 256이라 16,777,216의 색상을 표현할 수 있습니다.

여기서 알파 성분은 불투명도라 색상의 세기가 없어 표 일부러 뺏습니다.

표현할 수 있는 색상이 수백만게나 되니 굳이 각 성분당 32비트를 할당할 필요가 없겠죠??

 

자 그럼 저희는 각 성분당 나타낼 수 있는 빛의 세기가 1부터 255라는 것을 알았습니다.

하지만 저희가 알고 싶은 것은 빛의 세기의 정규화값입니다. 즉  0부터 1인 0-1 구간 사이의 %로 알고 싶습니다.

이를 구하는 공식은 다음과 같습니다.

 

  1. 각 색상을 255로 나눠줍니다
  2. 그리고 나눈 값을 부동소수점 값으로 바꿔주면 됩니다.

색상 비트 공식
색상 비트 공식

 

즉 정리하면 0-255 사이의 값은 정수값이고

이를 부동소수점 값으로 바꿔 0-1로 색상값을 나타낸 것을 정규화값이라 합니다.

결과적으로 빛의 세기는 정수값 1 = 정규화값 0이 빛의 최소 세기값이고 정수값 255 정규화값 1이 빛의 최대 세기값입니다.

RGBA
RGBA


오늘은 렌더링 파이프라인에 들어가기 전 알아두셔야 할 Direct3D에서 3차원 물체가 어떻게 표현되고 색상 비트는 어떻게 적용하는지 알아봤습니다.

그럼 다음 시간에는 렌더링 파이프라인이란 무엇인지 개념 설명을 하겠습니다.

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

댓글