1. 모델 표현

 장면(Scene)은 물체나 모델의 모음이다. 물체는 삼각형 메쉬의 묘사로 이루어지는데, 메쉬의 삼각형은 우리가 모델링하는 물체의 기본적인 구성 성분이 되며, 우리는 메쉬 삼각형을 참조하는 용어로 다각형(polygon), 기본형(primitive), 그리고 메쉬 기하물체를 상호 교환적으로 이용한다. 다각형에서 두개의 변이 만나는 지점을 버텍스(vertex)라 한다. 

세개의 버텍스로 정의된 하나의 삼각형

 -1 버텍스(vertex) 포맷

 Direct3D에서 버텍스는 수학적 정의 외에도 부가적인 특성으로 이루어진다. 하나의 버텍스는 법선 특성 외에도 색상 특성을 가질수 있다. 즉, Direct3D는 버텍스 포멧을 구성할 수 있는 유연성을 제공한다.

 -2 삼각형(Triangle)

 삼각형은 3D 물체의 기본 구성 요소로서, 물체를 구성하기 위해서는 물체의 모양과 외형을 묘사하는 삼각형 리스트를 만들어야 한다. 삼각형 리스트는 우리가 그리고자하는 각각의 삼각형에 대한 데이터를 포함하는데, 예를 들어, 사각형을 만들기 위해서는 두 개의 삼각형으로 나누고 각각의 삼각형을 구성하는 버텍스를 지정해야한다.

 -3 인덱스(Index)

 3D 물체를 구성하는 삼각형들은 동일한 버텍스들을 공유하는 경우가 많다. 모델의 복잡성과 세밀함이 증가할수록 중복되는 버텍스의 수 역시 증가한다. 이를 해결하기 위해 인덱스 개념을 이용하는데, 먼저 버텍스 리스트와 인덱스 리스트를 구성하고, 버텍스 리스트는 모든 버텍스들을 모함하며, 인덱스 리스트는 삼각형을 구성하기 위한 버텍스리스트로의 인덱스 값을 포함한다.

 

2. 가상 카메라

 카메라(Camera)는 관찰자가 볼 수 있는 세계의 부분을 지정하는 것으로, 2D 이미지를 생성하기 위해 세계의 어떤 부분이 필요한지를 결정하며, 세계 내에 위치하며 보여질 공간의 부피를 정의한다. 이 공간의 부피를 절두체(Frustum)이라 한다.

 절두체는 시야각과 가까운 평면, 먼 평면에 의해 정의된다.

절두체(Frustum)

 이 공간에 포함되지 않는 물체들은 보여지지 않으며 이후 처리에서 제외되어야 한다. 이와 같은 데이터의 제외 처리를 클리핑(Clipping)이라 부른다.

'DirectX9' 카테고리의 다른 글

렌더링 파이프라인  (0) 2021.06.02
Direct3D 기초  (0) 2021.06.02
VS2017에서 DirectX9 SDK 세팅하기  (0) 2021.06.02
평면(Plane)  (0) 2021.06.02
행렬의 변환  (0) 2021.05.31

1. Direct3D 개요

 Direct 3D는 3D 가속 하드웨어를 이용해 3D 세계를 표현 할 수 있도록 해주는 저수준 그래픽 API.

 그래픽 장치(3D 하드웨어)를 연결하는 중개자.

어플리케이션, Direct3D, 하드웨어 간의 관계

· Direct3D

 어플리케이션 또는 프로그래머에게 공개하는 인터페이스와 함수들로 구성되어 있다. 이들 인터페이스와 함수는 현재 버전의 Direct3D가 지원하는 모든 기능을 나타낸다. 

· HAL

 Direct3D와 그래픽 장치 사이에 하드웨어 추상 층(HAL: Hardware Abstraction Layer)이라는 중간 단계가 존재한다. 시장에 존재하는 그래픽 카드의 종류는 매우 다양하며 각각의 카드들은 다양한 방법으로 작동하기 때문에, Direct3D가 직접 그래픽 장치를 제어하기 불가능하다. 제조사에서 HAL을 구현하고, Direct3D가 HAL을 통해서 특정 작업을 요청하면 동작 방식이 다른 모든 그래픽 장치를 Direct3D의 동일한 명령으로 해당 작업을 수행한다.

 

2. COM(컴포넌트 객체 모델: Component Object Model)

 컴포넌트 객체 모델(COM)은 DirectX를 프로그래밍 언어에 독립적으로 만들어주고 하위 호환성을 갖출 수 있게 하는 기술. COM 객체를 인터페이스로 부르며, C++ 클래스와 비슷하게 이용.

 다른 COM 인터페이스의 매서드나 특수한 함수를 통해 COM 인터페이스의 포인터를 얻는다는 것이며, C++ new 키워드로 COM 인터페이스를 만드는 것이 아니다.

인터페이스를 이용하는 작업이 모두 종료되면, 인터페이스의 Release 메서드를 호출 할 것. COM 객체는 자신의 메모리 관리를 스스로 수행한다.

 

3. 기본적인 그래픽 개념과 Direct3D 형에 대한 이해

-1 표면(Surface)

 표면은 Direct3D가 주로 2D 이미지 데이터를 보관하는 데 이용하는 픽셀의 행렬이다.

표면

 -2 멀티 샘플링

 멀티 샘플링(Multisampling)은 픽셀 매트릭스로 이미지를 표현할 때 나타나는 거친 이미지를 부드럽게 만드는 기술

 -3 픽셀 포맷

 표면이나 텍스처를 만들기 위해서는 Direct3D 자원의 픽셀 포맷을 지정해야한다. 픽셀 포멧은 D3DFORMAT 열거형 멤버로 지정되며, 자주 이용하는 포멧은 다음과 같다

  • D3DFMT_R8G8B8 - 24bit 픽셀 포멧을 지정한다.
  • D3DFMT_X8R8G8B8 - 32bit 픽셀 포맷을 지정한다. 가장 왼쪽의 8bit는 이용하지 않는다.
  • D3DFMT_A8R8G8B8 - 32bit 픽셀 포맷을 지정한다. 가장 왼쪽의 8bit는 알파값을 지정한다.
  • D3DFMT_A16R16G16B16F - 64bit 부동소수점 픽셀 포맷을 지정한다. 가장 왼쪽의 16bit는 알파값을 지정한다
  • D3DFMT_A32R32G32B32F - 128bit 부동소수점 픽셀 포맷을 지정한다. 가장 왼쪽의 32bit는 알파값을 지정한다.

 -4 메모리 풀

 표면이나 그 밖의 다양한 Direct3D 자원들은 여러 가지 종류의 메모리 풀에 보관할 수 있다. 

  • D3DPOOL_DEFAULT - 디폴트 메모리 풀은 자원 타입과 이용 방식에 가장 적합한 자원들을 메모리에 보관하도록 Direct3D에 요청한다. 여기서 말하는 자원이랑 비디오 메모리나 AGP 메모리, 혹은 시스템 메모리 등을 말하는 것이고, 디폴트 풀 내의 자원은 반드시 IDirect3DDevice9::Reset 호출 이전에 해제 되어야 하며, reset 호출 이후에 다시 초기화되어야 한다.
  • D3DPOOL_MANAGED - 관리 풀에 보관된 자원은 Direct3D에 의해 관리된다(즉, 필요에 따라 자동으로 비디오 메모리나 AGP 메모리로 옮겨진다). 부가적으로 자원의 백업 복사본이 시스템 메모리 내에 보관되는데, 어플리케이션이 자원에 접근하고 수정할 때는 시스템 복사본을 이용하여, Direct3D는 필요에 따라 자동으로 이를 비디오 메모리에 갱신한다.
  • D3DPOOL_SYSTEMMEM - 시스템 메모리 내에 보관될 자원을 지정한다.
  • D3DPOOL_SCRATCH - 시스템 메모리 내에 보관될 자원을 지정한다. 앞의 D3DPOOL_SYSTEMMEM과 달리 이 풀의 자원은 그래픽 장치의 제한을 따라서는 안 된다. 따라서 장치는 이 풀 내의 자원에 직접 접근할 수 없지만, 자원을 두 풀 사이에 서로 복사하는 것은 가능하다.

 -5 스왑 체인과 페이지 플리핑

 Direct3D는 보통 두 개나 세 개의 표면을 하나의 컬렉션으로 관리하는데, 이를 스왑 체인이라 부른다. 스왑 체인은 IDirect3DSwapChain9 인터페이스를 통해 이용할 수 있다.

 스왑 체인 과 페이지 플리핑 기술은 프레임 간의 부드러운 애니메이션을 제공하기 위한 것이다. 다음은 두 개의 표면 간의 스왑 체인을 보여주고 있다.

두 개의 표면을 가진 스왑 체인(전면 버퍼와 후면 버퍼)

 전면 버퍼 슬롯의 표면은 현재 모니터에 디스플레이되는 이미지와 대응된다. 모니터도 전면 버퍼의 이미지를 즉시 디스플레이 할 수 있는 것은 아니며, 주사율에 따라 약간의 시간이 필요하다. 60Hz의 주사율을 가진 모니터면 1/60초 정도의 시간이 필요하다. 어플리케이션의 프레임율과 모니터의 주사율이 동기화 되지 않는 경우가 흔한데, 이를 해결 하기 위해 화면 밖의 표면(후면 버퍼)에 렌더링을 수행하고, 전면 버퍼의 디스플레이가 완료되면 스왑 체인의 끝으로 돌아가 후면 버퍼를 전면 버퍼로 전환하는 방법을 이용한다.

 렌더링 코드의 구조는 다음과 같다. 

  1. 후면 버퍼를 렌더링한다.
  2. 후면 버퍼를 시연한다.
  3. 1번으로 돌아간다.

-6 깊이 버퍼

 깊이 버퍼(depth buffer)는 이미지 데이터가 아닌 특정 픽셀의 깊이 정보를 포함하는 표면을 말하며, 깊이 버퍼 내에는 최종 렌더링된 이미지의 각 픽셀에 해당하는 항목들을 포함한다. Direct3D는 물체의 픽셀이 다른 픽셀을 가리는지 여부를 판단하기 위해 깊이 버퍼링 혹은 z-버퍼링을 이용한다.

 깊이 버퍼링은 각 픽셀의 깊이 값을 계산하고 깊이 테스를 수행한다. 카메라와 가까운 픽셀이 뒤쪽의 픽셀을 가리는 간단한 원리다.

 

 -7 버텍스 프로세싱

 버텍스는 3D 기하물체를 구성하는 기본 단위로, 소프트웨어(software vertex processing)나 하드웨어(hardware vertex processing)의 두 가지 방법으로 처리할 수 있다.

'DirectX9' 카테고리의 다른 글

렌더링 파이프라인  (0) 2021.06.02
Direct3D에서의 모델 표현과 가상 카메라  (0) 2021.06.02
VS2017에서 DirectX9 SDK 세팅하기  (0) 2021.06.02
평면(Plane)  (0) 2021.06.02
행렬의 변환  (0) 2021.05.31

개발 환경

Window 10 Pro (20H2)

Visual Studio 2017

DirectX9 SDK(June 2010)

DirectX9 SDK(June 2010) 다운로드 하기

 

DirectX SDK - (June 2010)

This download is the legacy DirectX SDK. It is now end-of-life and should only be used for maintaining older software. For targeting DirectX for Windows 7 or later, use the modern Windows SDK instead.

www.microsoft.com

 

(1) SDK 설치하기

두 개의 선택지중 아무거나 해도 상관없습니다.
설치 진행

단, 설치 중 다음과 같은 에러가 발생할 수 있다.

해당 컴퓨터에 일반 배포용 런타임 패키지 설치시 나오는 오류(S1023)
두 항목을 삭제 하고 재설치하면 해결된다.

 

(2) Visual Studio 2017 환경 세팅

 

새 프로젝트를 만든다
속성 열기
VC++ 디렉터리에서 방금 설치한 DirectX SDK의 경로를 '포함 디렉터리'와 '라이브러리 디렉터리'에 추가해주어야 한다.
포함 디렉터리에 Include 폴더를 경로 추가
라이브러리 디렉터리에 Lib\x86 폴더를 경로 추가
링커에 실질적으로 사용하는 lib파일을 추가해 주어야한다.

 

추가 종속성에 다음 라이브러리를 추가한다. d3d9.lib, d3dx9.lib, winmm.lib
구성 속성->일반으로 가서 문자 집합을 멀티바이트 문자 집합 사용으로 변경

위 과정이 완료 되면 개발환경이 적용되었다.

 

'DirectX9' 카테고리의 다른 글

Direct3D에서의 모델 표현과 가상 카메라  (0) 2021.06.02
Direct3D 기초  (0) 2021.06.02
평면(Plane)  (0) 2021.06.02
행렬의 변환  (0) 2021.05.31
항등 행렬, 역 행렬, 행렬의 전치  (0) 2021.05.31

- 평면의 방정식

평면(Plane)은 하나의 벡터 n과 평면 상의 점 으로 표현된다. 이때 벡터 n은 평면의 법선 벡터 라고 부르며 평면과 수직을 이룬다.

 

평면 위의 임의의 점을 P라고 했을때, 법선 벡터 n과 는 서로 직교하므로, 다음 방정식을 만족 한다.

평면의 방정식의 일반 형은 으로 표현 할 수 있는데, 이 때 d는 원점 간의 거리가 된다. 즉, 두 벡터의 내적과 원점 까지의 거리를 이용해 다음과 같은 평면의 방정식을 유도 할 수 있다.

평면의 방정식

- 점과 평면 공간의 관계

 평면의 방정식을 이용하면 점p와 평면의 관계를 알 수 있다.

  • 일 때, 점 p는 평면 위에 존재 한다.
  • 일 때, 점 p는 평면의 앞 공간에 존재한다.
  • 일 때, 점 p는 평면의 뒷 공간에 존재한다.

- 평면 정규화

 때때로 평면의 법선 벡터를 정규화 해야하는 상황이 생기는데, 단순히 법선 벡터 n만 정규화하면 끝이 아니라는 것을 명심 해야한다.

의 식과 마찬가지로 법선 벡터의 길이가 상수 d에 영향을 주기 때문에, 법선 벡터를 정규화 하면 도 마찬가지로 다시 계산 해야한다. 따라서 평면 를 정규화 하기위해서는 다음과 같은 식이 필요하다.

평면의 정규화

'DirectX9' 카테고리의 다른 글

Direct3D 기초  (0) 2021.06.02
VS2017에서 DirectX9 SDK 세팅하기  (0) 2021.06.02
행렬의 변환  (0) 2021.05.31
항등 행렬, 역 행렬, 행렬의 전치  (0) 2021.05.31
행렬(Matrix)  (0) 2021.05.31

Direct 3D를 이용한 프로그래밍에서는 변환을 표현하기위해 4x4 행렬을 이용하며, 기본적인 방식은 다음과 같다.

 

4x4 행렬 X의 각 항목을 특정한 값으로 채운 다음, 1x4 행 백터 v의 열에 포인트의 좌표나 벡터를 넣는다. 

 

 

행렬 X는 변환에 따라 이동 행렬(Translation Matrix) , 회전 행렬(Rotation Matrix), 크기 변형 행렬(Scale Matrix)로 구분할 수 있다.

 

- 이동 행렬(Translation Matrix

이동 행렬(Translation Matrix)

 벡터 v를 위 그림과 같이 이동시킨다고 가정할 때, 다음과 같은 행렬과 곱하면 x축으로 y축으로 , z축으로 만큼 이동 시킬수 있다.

이동 행렬 T(p)

이동 벡터 p의 부호를 바꾸는 것으로 간단하게 역 행렬을 얻을수 있다.

이동 행렬의 역 행렬

 

- 회전 행렬(Rotation Matrix)

회전 행렬(Rotation Matrix)

 다음 행렬을 이용하면 각 축을 기준으로 시계방향으로 회전하는 행렬을 구성할 수 있다.

X축 회전 행렬
Y축 회전 행렬
Z축 회전 행렬

회전행렬 의 역 행렬은 전치 행렬 와 같다. 

- 크기 변환 행렬(Scale Matrix)

크기 변환 행렬(Scale Matrix)

  크기 변환 행렬 를 벡터와 곱셈을 하면 벡터의 크기를 p만큼 변환할 수 있다.

크기 변환 행렬 S

역행렬은 인자의 역수를 넣어 얻을 수 있다.

크기 변환 행렬의 역 행렬

 

-변환 행렬의 조합

 벡터 v에 대하여 이동을 위한 행렬 T, 회전을 위한 행렬 R, 크기 변환 행렬 S가 있을 경우, 최종적으로 구해지는 벡터 v'은 다음과 같다.

 

'DirectX9' 카테고리의 다른 글

VS2017에서 DirectX9 SDK 세팅하기  (0) 2021.06.02
평면(Plane)  (0) 2021.06.02
항등 행렬, 역 행렬, 행렬의 전치  (0) 2021.05.31
행렬(Matrix)  (0) 2021.05.31
벡터의 연산  (0) 2021.05.31

- 항등 행렬(identity matrix)

 항등 행렬은 중심 대각선의 성분이 1이고 나머지 성분이 전부 0인 정방 행렬을 말한다. 

2차 3차 4차 항등행렬

항등 행렬은 곱셈에서 항등성을 가진다. 항등행렬은 로 표현 할 수 있다.ㅎ

- 역 행렬

행렬에서 나눗셈은 없지만, 곱하기와 반대의 의미를 가지는 역 연산이 존재한다. 이를 역 행렬 이라고 하는데, 역 행렬은 다음과 같은 특징을 가진다.

  • 정방 행렬만이 역 행렬을 가질 수 있다. 즉 역 행렬을 이야기할 때는 정방 행렬에 대해 이야기 하는 것과 같다.
  • 행렬 의 역 행렬  은 로 표현 할 수 있다.
  • 모든 정방 행렬은 역 행렬을 가지지 않는다.
  • 행렬과 역행렬을 곱하면 항등행렬을 얻는다. 행렬은 자신의 행렬과 곱할 때 서로 상호 교환이 가능하다.

- 행렬의 전치

 행렬의 열과 행을 교환하면 행렬의 전치(transpose)를 수행 할 수 있다. 즉 행렬 의 전치 행렬은 행렬 로 표현 할 수 있다.

행렬 B의 전치 행렬

 

'DirectX9' 카테고리의 다른 글

평면(Plane)  (0) 2021.06.02
행렬의 변환  (0) 2021.05.31
행렬(Matrix)  (0) 2021.05.31
벡터의 연산  (0) 2021.05.31
3 차원 공간의 벡터  (0) 2021.05.31

-행렬(Matrix)이란?

 수 또는 다항식을 사각형 모양으로 배열 한 것. 행과 열의 수는 행렬의 차원을 결정하고, 행렬의 성분은 아래첨자로 표현해서 다음과 같이 나타낸다. 

3x3 행렬의 일반적인 표현

 때로는 한 개의 행이나 열로 표현 하는 벡터가 있을 수 있는데, 이와 같은 행렬을 행 벡터 또는 열 벡터라고 한다.

- 상등 행렬

 두 행렬의 차원과, 각 성분이 같은 경우 두 행렬은 동일한 행렬이다.

  이면, 이다.

 

 

- 행렬의 사칙연산

 행렬은 기본적으로 덧셈 뺄셈, 스칼라의 곱이 가능하다.

행렬의 덧셈
행렬의 스칼라 곱

 

- 행렬의 곱셈

 두 행렬 A,B 간의 곱셈은 행렬 A의 열의 수와 행렬 B의 행의 수가 같은 경우에만 곱셈이 가능하다. 두 행렬이 각각 다음과 같이 정의 되는 경우, 두 행렬의 곱셈은 다음과 같다.

2x3 행렬과 3x3 행렬의 곱셈. 결과값으로 2x3 행렬이 된다.

 

'DirectX9' 카테고리의 다른 글

평면(Plane)  (0) 2021.06.02
행렬의 변환  (0) 2021.05.31
항등 행렬, 역 행렬, 행렬의 전치  (0) 2021.05.31
벡터의 연산  (0) 2021.05.31
3 차원 공간의 벡터  (0) 2021.05.31

- 벡터의 상등

 기하학적으로는 같은 방향과 같은 크기를 가진 두 벡터는 같은 벡터로 본다. 라면, 이다.

 

- 벡터의 크기

 벡터의 크기는 방향을 가진 선분의 길이이다. 벡터의 성분이 주어졌다고 할 때, 다음과 같은 식으로 벡터의 크기를 계산 할 수 있다.

벡터의 크기 연산

- 벡터의 정규화(Normalize)

 벡터의 정규화(Normalize)는 벡터의 크기를 1로 만들어 단위 벡터가 되도록 하는 것이다. 성분의 값을 벡터의 크기로 나누면 정규화가 된다.

벡터의 정규화

- 벡터 더하기, 빼기

 반드시 동일한 차원에 존재하는 벡터간에 더하고 빼기가 가능하다. 

벡터의 덧셈 뺄셈

- 벡터의 스칼라 곱

 벡터는 스칼라와 곱이 가능하며, 각 성분에 스칼라 값을 곱한 만큼 표현한다.

벡터의 스칼라 곱

 

- 벡터의 내적

 두 벡터의 각 성분의 곱한 값을 전부 더한 값이 된다. 

벡터의 내적

 코사인 법칙을 이용하면 벡터의 내적의 값이 각 벡터의 크기값의 곱으로 표현할 수 있다. 또한 벡터의 내적값에 따라 다음과 같은 특징을 가진다.

참고) 벡터 내적 공식 유도 : a * b = |a||b|cosθ 유도하기 (tistory.com)

  • 라면 두 벡터는 직교한다.
  • 라면 두 벡터간의 각도 는 예각이다.
  • 라면 두 벡터간의 각도 는 둔각이다.

- 벡터의 외적

 두 벡터 u,v의 외적을 하게되면 두 벡터와 수직하는 새로운 벡터 p를 얻을 수 있다. 즉 인 새로운 벡터를 구할 수 있다. 외적을 구하는 식은 다음과 같다.

벡터의 외적

 

'DirectX9' 카테고리의 다른 글

평면(Plane)  (0) 2021.06.02
행렬의 변환  (0) 2021.05.31
항등 행렬, 역 행렬, 행렬의 전치  (0) 2021.05.31
행렬(Matrix)  (0) 2021.05.31
3 차원 공간의 벡터  (0) 2021.05.31

+ Recent posts