안녕하세요 보글리아입니다.
저번 시간부로 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 구간 사이의 %로 알고 싶습니다.
이를 구하는 공식은 다음과 같습니다.
- 각 색상을 255로 나눠줍니다
- 그리고 나눈 값을 부동소수점 값으로 바꿔주면 됩니다.
즉 정리하면 0-255 사이의 값은 정수값이고
이를 부동소수점 값으로 바꿔 0-1로 색상값을 나타낸 것을 정규화값이라 합니다.
결과적으로 빛의 세기는 정수값 1 = 정규화값 0이 빛의 최소 세기값이고 정수값 255 정규화값 1이 빛의 최대 세기값입니다.
오늘은 렌더링 파이프라인에 들어가기 전 알아두셔야 할 Direct3D에서 3차원 물체가 어떻게 표현되고 색상 비트는 어떻게 적용하는지 알아봤습니다.
그럼 다음 시간에는 렌더링 파이프라인이란 무엇인지 개념 설명을 하겠습니다.
긴 글 읽으시느라 고생 많으셨습니다~~
'IT 기술 > Direct3D' 카테고리의 다른 글
Direct3D 렌더링 파이프라인(VS 단계 1부) part2_20일차 (0) | 2023.01.29 |
---|---|
Direct3D 렌더링 파이프라인(IA 단계) part2_19일차 (0) | 2023.01.28 |
Direct3D 초기화 작업(뷰포트) part4_17일차 (0) | 2023.01.26 |
Direct3D 초기화 작업(깊아 버퍼 뷰) part3_16일차 (0) | 2023.01.26 |
Direct3D 초기화 작업(렌더 대상 뷰) part2_15일차 (0) | 2023.01.26 |
댓글