1학기 결산-게임엔진프로그래밍활용

이미지
1. 브레젠험 직선 알고리즘 컴퓨터에서 계산이 느린 실수 연산을 사용하지 않고 직선을 그리기 위해 만들이진 알고리즘입니다. 평면을 아래와 같이 8분 면으로 나누어 직선을 그립니다. 링크:  https://sulinep.blogspot.com/2020/05/bresenhams-line-algorithm.html 2. 엔진 기초 수학 여기서는 본격적으로 구현에 들어가기 전 기초 수학 지식을 쌓았습니다.  수학에서의 체는 대수적 구조의 하나로 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산을 집합 안에서 소화할 수 있는 집합을 의미합니다. 체를 이루기 위한 조건과 체라는 개념을 알아보았습니다. 처음에 체 라는 개념이 뭔가 머릿속에서 애매했는데 이후 갈로이스 체에 대해 배운 후 조금 더 명확해졌습니다. 스칼라 는 벡터를 정의하기 위한 필수 요소이고 크기만 있고 방향이 없는 성분이다. 벡터는 크기와 방향을 포함하는 표현 도구이다. 겨기서 벡터의 기본 연산자들을 알아보았습니다. 선형성 은 직선처럼 똑바른 도형 또는 그와 비슷한 성질을 가진 대상이라는 뜻으로 함수의 경우 함수가 진행하는 모양이 직선이라는 의미로 사용된다. 선형성을 만족하려면 두 가지 조건을 만족해야 하는데 균질성과 첨가성이다. homogeneity (균질성):   additivity (첨가성): 선형이라고 부르는 수식들은 중첩의 원리 가 적용된다는 특징이 있다. 이때 행렬과 선형 변환의 관계에 대하여도 알아보았었는데 선형 변환과 행렬은 1:1 대응된다. 기저 란 어떤 벡터 공간을 선형 생성하는 선형 독립인 벡터들이다. 각각의 원소들이 다시 벡터 공간을 생성할 수 있어야하고 일차 독립이어야 한다. 표준 기저 는 많은 기저들 중 성분 1개만이 1이고 나머지 성분이 모두 0인 표준 적인 벡터이다. 여기서 벡터 공간 R의 기저를 구성하는 원소의 개수가 해당 공간의 차원 이다. 행렬 은 열기반 행렬과 행기반 행렬 중 어떤 걸 사용하느냐에 따라 계산 방식이 달라진다. 여기서는 벡터의 크기, 회전, 밀기, 선형 변환에 대하여

[DirectX12] - 교환 사슬(Swap Chain)과 깊이 버퍼(Depth Buffer)

이번에 공부할 내용은 DirectX에서 사용되는 교환 사슬과 깊이 버퍼입니다.

먼저 교환 사슬(Swap Chain)에 관한 것부터 짚고 넘어가겠습니다.

1. 교환 사슬(Swap Chain)
 WinAPI를 해보신 분들을 아시겠지만 애니메이션이 껌벅이는 현상을 이중 버퍼를 통해 해결했습니다.

 전면 버퍼와 후면 버퍼로 이루어진 이중 버퍼의 간단한 원리입니다.
 ① 장면의 한 프레임 전체를 화면 바깥 텍스처(버퍼)에 그립니다. → 후면 버퍼
 ② 위에서 그린 버퍼를 화면에 표시해줍니다.
 ③ 이때 또 다른 하나의 버퍼는 화면 바깥 텍스처(버퍼)에 그립니다.

 위의 과정을 반복하면 사용자는 완성된 프레임만 보기 때문에 화면이 그려지는 과정이나
 화면이 껌벅이는 현상을 볼 수 없습니다.

 이제 다시 돌아와서 스왑 체인은 무엇일까요? 우선 기술되어 있는 내용을 보겠습니다.
 MSDN: 스왑 체인은 사용자에게 프레임을 표시하는 데 사용되는 버퍼 모음입니다.
 참고 도서: 전면 버퍼와 후면 버퍼는 하나의 스왑 체인(Swap Chain)을 형성한다.
 라고 나와있습니다.

 즉 스왑 체인은 이중 버퍼링에 사용되는 전면 버퍼와 후면 버퍼의 모음입니다.














 그럼 Direct3D에서는 어떻게 이중 버퍼가 이루어지는지 알아보겠습니다.
 Direct3D에서 페이지가 전환되게 하는 것을 제시(Prensenting)이라고 부릅니다.
 제시는 버퍼들의 내용을 맞바꾸는 것이 아니라 현재 전면 버퍼의 포인터와 후면 버퍼의 포인터만
 맞바꾸면 됩니다. 내용 자체를 맞바꾸는 것이 아니기 때문에 효율적인 연산이죠.

 아래 그림은 제시가 이루어지는 과정을 그림으로 나타낸 겁니다.











 Direct3D에서는 IDXGISwapChain이라는 교환 사슬을 대표하는 인터페이스가 있습니다.
 이 인터페이스는 전후면 버퍼 텍스처를 담고 버퍼 크기 변경을 위한 메서드 제시를 위한 메서드 등을 제공합니다.


2. 깊이 버퍼(Depth Buffer)
 깊이 버퍼는 각 픽셀의 깊이 정보를 담는다.
 깊이 정보란 3D 공간의 관찰자에서 물체의 멀고 가까움을 이야기한다.

 픽셀의 깊이는 0.0에서 1.0까지의 값을 가지며
 0.0은 관찰자에서 최대한 가까운 물체이고 1.0은 가장 먼 물체입니다.
 깊이 버퍼의 픽셀 원소와 후면 버퍼의 원소는 일대일로 대응됩니다.
 즉 모든 픽셀이 깊이 정보를 가지고 있다.
 ※후면 버퍼의 해상도가 720 X 480이라면 깊이 버퍼는 720 X 480개의 원소로 구성된다.

 Direct3D에서는 물체들의 깊이 판정을 위해 깊이 버퍼링 또는 Z-버퍼링이라는 기법을 사용한다.
 그럼 밑의 모델을 가지고 깊이 버퍼링의 작동 방식을 알아보겠습니다.















 이 사진 속 모델은 사각뿔과 사각형이 있다.
 왼쪽 사진을 보면 사각뿔이 더 앞에 있기 때문에 사각뿔과 사각형이 겹치는 부분을 사각뿔이 가리는 모습을 볼 수 있다.


 이번에는 조금 더 자세하게 3D 공간을 풀었습니다.
























연산
판정된 점
거리
판정
지우기
검은색
1.0
해당 깊이 항목이 초기화 된다.
사각뿔 그리기
P1
d1
d1≤1.0 이므로 버퍼가 P=P1, d=d1로 갱신된다.
사각형 그리기
P1
d1
d1<d2 이므로 버퍼가 갱신되지 않는다.

 판정은 위의 표와 같이 거리를 비교하고 해당 버퍼를 갱신한다.

 ※ 깊이 문제를 해결하는 방법 중 물체들의 그리는 순서를 조정해도 되지만 이 작업은 물체들을 정렬해야 하기 때문에 
시간이 오래 걸릴 수도 있다. 하지만 깊이 버퍼링은 그래픽 하드웨어에서 공짜로 일어난다. 


 또한, 깊이 버퍼는 하나의 텍스처이기 때문에 특정한 자료 형식을 지정할 필요가 있다.
 텍스처 형식에 대한 내용은 뒤에 나오겠지만
 여기서 하나만 짚고 넘어가겠습니다. 깊이 버퍼는 RGB 값 같은 원소를 포함할 필요가 없기 때문에
 특정한 텍스처 자료 형식을 사용합니다.


긴 글 읽어주셔서 감사합니다.
다음에는 텍스처 형식과 자원 및 서술자에 대하여 알아보겠습니다. 

댓글

이 블로그의 인기 게시물

[알고리즘] 코헨 서더랜드 알고리즘(Cohen–Sutherland algorithm)

[알고리즘] 브레젠험 직선 알고리즘 (Bresenham's line algorithm)

오일러 각, 로드리게스 회전 공식, 평면의 방정식