2018년 1월 13일 토요일

COM and Direct3D

COM and Direct3D


이 글을 보기 전에 COM에 대한 다음 링크의 내용을 우선 읽어보기 바란다.


링크된 글에서 볼 수 있듯이 COM은 Component Object Model 의 약자이다. COM은 매우 발전된 잘 만들어진 오브젝트를 만드는 방법중 하나이다. 이는 마치 레고 블럭과 같다.


아시다시피 레고 블럭은 그 각각이 규격화 된 모양들로 이루어 지며 이러한 각각의 모양들을 서로 맞추어 다양한 커다란 구조를 만들어 낸다.
레고 블록의 각각 객체들은 서로 다른 부분에 대한 내부적인 내용을 신경 쓸 필요 없으며 단지 각각의 연결에 대한 규격만 맞추면 된다. 만약 어떤 조각을 바꾸고 싶다면 해당 조각을 빼내고 다른 조각을 연결하면 된다.
이런 조각들은 서로 호환이 가능하지만 그 스스로는 어떠한 일을 할 수 없기 때문에 서로 조립 되어야 한다.


COM 객체는 C++의 클래스 또는 이러한 클래스들을 체계적으로 그룹화하여 함수을 호출하는 방식으로 조립 될 수 있다. 어떠한 클래스도 서로 다른 클래스의 내부를 관여할 필요는 없으며 필요에 의하여 붙고 때어낼 수 있는 플러그인 구조를 제공하게 된다.


이러한 방식은 어떠한 기능을 개선하거나 교체할 필요가 있을때 해당 플러그인만 교체하면 전체적인 어플리케이션을 교체하지 않아도 업그레이드가 가능하다는 것이다.


Direct3D 프로그래밍을 하는데 있어서 COM의 내부 구조까지 깊숙히 알아야 할 필요는 없다. 그 구조는 매우 복잡할 수 있으며 이에 대한 자세한 내용을 알 필요는 없다.


Direct3D 는 DirectX 기술에 기인하며 이는 COM 기반으로 제공된다. Direct3D 의 내부는 또 다른 COM을 사용하는 COM 객체이다. 궁극적으로 여기에는 소프트웨어, 하드웨어, 또는 기타 어떤것이 됬든 2D 및 3D 그래픽을 실행하는데 필요한 모든 것이 포함되어 있다는 것이다.


device->CreateRenderTargetView()


device->Release()


위와 같은 코드를 살펴보자.
device 라는 객체는 Direct3D에서 생성된 객체로 이는 다수의 호출 가능한 멤버 함수들로 인터페이스를 구성하고 있다. 이러한 함수 내부에서 작동하는 코드는 매우 복잡하며 우리가 신경쓸 필요는 없다. 단지 이러한 함수들의 사용법에만 집중하면 된다.


COM이 내부적으로 동작하는 일은 매우 복잡하며 이들에 대하여 다 알 필요는 없으며 단지 다음과 같은 내용을 숙지하기 바란다.


  1. COM 객체는 인터페이스에 의해 제어되는 클래스 또는 클래스 집합이다. 인터페이스는 COM 객체를 제어하는 일련의 함수이며 위에 예제에서 “device”는 COM 객체이고 CreateRenderTargetView(), Release() 와 같은 함수를 호출하여 이를 제어할 수 있다는 것이다.
  2. 각 유형의 COM 객체는 고유한 ID를 갖는다. 예를 들어, Direct3D 객체는 고유한 ID를 가지며 DirectSound 객체는 이에 해당하는 고유 ID를 갖는다는 것이다. Direct3D 프로그래밍을 하다 보면 이러한 고유한 ID 를 사용해야 할 경우가 많이 있게 된다.
  3. COM 객체를 사용한 후에는 Release() 함수를 호출해 주어야 한다. 그러면 해당 객체는 메모리를 해제하고 해당 스레드를 닫을 것이다.
  4. COM 객체는 일반적으로 “ID3D10Device” 와 같이 “I” 라는 문자(i 의 대문자)로 시작하기 떄문에 쉽게 식별할 수 있다.

댓글 없음:

댓글 쓰기

Vertex , 정점 정보의 확장

Vertex , 정점 정보의 확장 그동안의 설명에 있어서 우리는 VERTEX 정보에 대하여 3 차원의 위치 정보만 사용하였다. struct VERTEX {float x,y,z;}; 이제 이를 확장하여 색상을...