Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

승쨩개발공부

[Direct X] Direct X 기본 개념 본문

DirectX 9

[Direct X] Direct X 기본 개념

Unknowns 2021. 11. 17. 18:04

Direct 3D?

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

즉, 어플리케이션과 그래픽 장치를 연결하는 중개자 정도로 생각하면 된다.

 

어플리케이션 -> Direct3D -> HAL -> 그래픽 장치

Direct3D 파트는 Direct3D가 애플리케이션 / 프로그래머에게 공개하는 인터페이스와 함수들로 구성되어 있으며, 이들

인터페이스와 함수는 현재 버전의 Direct3D가 지원하는 모든 기능을 나타낸다.

그렇지만 Direct3D가 공개하고 있는 기능이라고 해도 그래픽 하드웨어에서 반드시 지원하리라는 보장은 없다.

 

HAL?

Direct 3D와 그래픽장치 사이에는 HAL(하드웨어 추상 층 : Hardware Abstraction Layer)라 불리는 중간단계가 존재.

그래픽카드 제조사는 MSI, GIGABYTE, ASUS, 사파이어 등 여러 종류가 있고 다양한 방법으로 작동하기 때문에 Direct3D가 직접 그래픽 장치를 제아하기란 불가능하다.

 

Ex) 화면소거와 같은 간단한 작업에서도 그래픽카드마다 전혀 다른 방식을 이용할 수 있다.

그렇기 때문에 Direct3D는 장치 제조 사에게 HAL을 구현할 것을 요구하고 있다.

HAL은 장치로 하여금 특별한 작업을 수행하도록 하는 장치 고유의 코드로, 이를 통해 Direct3D가 각 장치의 세부적인 부분을 제어할 필요가 없도록 하고, 하드웨어 장치에 독립적인 규약을 확립하는 것이 가능하다.

 

REF장치?

Direct3D에서 제공하는 기능을 이용하는 프로그램을 작성하려고 하는 경우 Direct3D API장치를 소프트웨어로 에뮬레이트 하는 레퍼런스 레스터라이저(Reference Restorizer)를 제공하며, 이를 통해 장치에서 지원하지 않는 Direct3D기능을 이용하는 코드를 작성하고 테스트 할 수 있다.

 

 

D3DDEVTYPE?

HAL장치는 D3DDEVTYPE 열거형인 D3DDEVTYPE_HAL로 지정.비슷하게 REF 장치 역시 D3DDEVTYPE 열거형의 멤버인 D3DDEVTYPE_REF로 지정된다.장치를 만들떄는 어떤 타입을 원하는지를 지정해야 하므로 이들 타입에 대해서는 반드시 기억해야 한다.

 

COM객체?

컴포넌트 객체모델(COM : Component Object Model)은 DirectX를 프로그래밍 언어에 독립적으로 만들어주고 하위 호완성을 갖출 수 있게 하는 기술, (C++ 클래스와 비슷하게 이용됨)

 

C++를 이용해 DirectX를 프로그래밍하는동안 COM의 세부적인 부분들은 거의 대부분 프로그래머 간섭없이 작동하는데, 반드시 기억해야 할 한가지는 다른 COM인터페이스의 메서드나 특수한 함수를 통해 COM 인터페이스의 포인터를 얻는다는것!

 

C++ new 키워드로 COM인터페이스를 만드는것이 아니다!

 

부가적으로, 인터페이스를 이용하는 작업이 모두 끝나면 우리가 직접 이를 지우는 것이 아니라 인터페이스의 Release 메서드를 호출 해야한다.(모든 COM인터페이스는 IUnknown COM 인터페이스에서 기능을 상속받는다,)

COM 객체는 자신의 메모리 관리를 스스로 수행한다.

COM 인터페이스는 접두어로 대문자 I를 가진다 예를 들어, 표면을 나타내는 COM인터페이스의 이름은

Direct3D Suface9 이다.

 

SURFACE?

Surface(표면)

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

표면의 요소 - 픽셀

표면 데이터를 행렬로 그려냈지만, 실제로 픽셀 데이터는 선형 배열에 보관된다.

 

표면의 너비와 높이는 픽셀 단위로 계산된다. 피치는 바티으로 계산되며, 하드웨어 구현에 따라서는 너비보다 길 수도 있다. 따라서 피치 = 너비 * sizeof(pixelForm at)라고 할 수는 없다.

 

코드에서 표면을 이용하는 데는 IDirect3DSurface9 인터페이스가 이용된다. 이 인터페이스는 표면에서 직접 얻는 데이터를 읽고 쓰는 몇 가지 메서드와 함꼐 표면에 대한 정보를 얻는 메서드들을 제공한다.

 

LookRect - 이 메서드는 표면 메모리로의 포인터를 제공한다. 여기서 약간의 포인터 연산을 거치면 표면 내의 각 픽셀을 읽고 쓸 수 있게된다.

 

UnLockRect - LockRect를 호출하고 표면 메모리에 대한 작업이 끝난 뒤에는 이 메서드를 호출하여 표면의 잠금을 해제해야 한다.

 

GetDesc - 표면의 대한 정보를 D3DSURFACE_DESC 구조체를 통해 얻는다.

 

중요하지만 뒤에서 좀 더 세세히 보고 지금은 이런게 있다는 정도만 알고 넘어가자.

 

 

메모리 풀?

Surface나 그 밖의 다양한 Direct3D 자원들은 여러 가지 종류의 메모리 풀에 보관 할 수 있다. 메모리 풀은 D3DPOOL 열거형의 멤버로 저장되며, 이용할 수 있는 메모리 풀에는 다음과 같은 것들이 있다.

 

D3DPOOL_DEFAULT - 디폴트 메모리 풀은 자원의 타입과 이용 방식에 가장 적합한 자원들을 메모리에 보관하도록

Direct3D 에 요청한다. 여기서 말하는 자원이란 비디오 메모리나 AGP 메모리, 혹은 시스템 메모리 등을 말하는 것으로,

디폴트 풀 내의 자원은 반드시 IDirect3DDevice9::Reset호출 이전에 파괴(해제)되어야 하며, reset 호출 이후에 다시

초기화되어야 한다.

 

D3DPOOL_MANAGED - 관리 풀에 보관된 자원은 Direct3D에 의해 관리된다.(즉, 필요에 의해 자동으로 비디오 메모리나 AGP 메모리로 옮겨진다). 부가적으로 자원의 백업 복사본이 시스템 메모리 내에 보관되는데, 애플리케이션이 자원에

접근하고 수정 할 때는 시스템 복사본을 이용하며, Direct3D는 필요에 따라 자동으로 이를 메모리에 갱신한다.

 

 

D3DPOOL_SYSTEMMEM - 시스템 메모리 내에 보관될 자원을 지정한다.

 

 

D3DPOOL_SCATCH - 시스템 메모리 내에 보관될 자원을 지정한다, 앞서의 D3DPOOL_SYSTEMMEM과는 달리 이 풀의

자원은 그래픽 장치의 제한을 따라서는 안 된다. 따라서 장치는 이 풀 내의 자원에 직접 접근을 할 수 없지만, 자원들

두 풀 사이에 서로 복사하는 것은 가능하다.

'DirectX 9' 카테고리의 다른 글

[Direct X] 행렬  (0) 2021.11.13
[Direct X] 벡터(Vector), 연산자, 내적, 외적  (1) 2021.11.11
[Direct X] Direct X 시작하기  (0) 2021.11.11