2018년 1월 12일 금요일

OpenGL vs. Direct3D

OpenGL vs. Direct3D

CAD 프로그램을 작성하는데 있어서 가장 중요하고도 필요한 기술이다.
대표적으로 Windows System에서 사용되는 Graphic 기술은 크게 두가지 엔진에 기반하게 된다.

  1. OpenGL
  2. Direct3D

우리는 OpenGL과 Direct3D 에 대해 기본적인 차이점은 이미 알고 있다고 생각하고 이 문서를 작성 하도록 한다.

그 이유는 이들 각각을 서로 비교한다거나, 그들의 역사를 이야기 한다거나 하는 것은 시간과 지면이 많이 필요하다. 또한 그에 따르는 기술역시 설명이 복잡하다.

우리는 이 두가지 기술을 이용하여 CAD 프로그램을 작성하는데 있어서 필요한 기술에 대해서만 논의 할 것이다. 그것만 해도 매우 많은 부분을 우리가 이해하고 준비해야 하기 때문이다.

Direct3D 와 OpenGL은 모두 어플리케이션 프로그래밍 API 이며 이들은 모두 2D(사실 3D에서 z를 제거한것) 와 3D 컴퓨터 그래픽을 지원하며 모두 하드웨어 가속(hardware acceleration) 을 지원하고 있다.


Platform
Direct3D는 Microsoft Window 플렛폼에서만 작동한다.

이에 반해 OpenGL API는 Open Standard를 따른다. 이 말은 거의 모든 다양한 플렛폼에서 이를 지원하고 있다는 것이다.

Programming Language
Direct3D 는 그 초기 버전부터 Microsoft Component Object Model(COM) 에 기반하여 제공한다. 이 말은 다양한 컴퓨터 프로그래밍 언어에서 이를 사용할 수 있다는 것이다. 단 이들 언어가 COM 을 지원해야 한다는 것이다.  이들 언어 몇가지를 살펴보면 Open Pascal (Delphi) 및 Visual C++, C#, Visual Basic .NET 등이 COM을 지원하고 있다.

OpenGL 은 C 언어를 기반으로 하여 프로그래밍 할 수 있다. 그러나 OpenGL 은 State Machine 개념으로 작동하도록 설계 되어 있기 때문에 이러한 State machine에 접근할 수 있는 binding을 제공한다면 OpenGL을 사용할 수 있다는 말이다. 사실 이러한 개념이 COM 보다는 더 효과적인 방법일 수 있다.


Performance
초창기의 OpenGL 및 Direct3D 의 성능 비교는 지금의 싯점에서는 무의미 하다.
만은 전문적인 툴(CAD , 의학, 에니메이션등) 은 대부분 OpenGL을 기반으로 작성되어 왔다. 그 이유는 다양한 OS Platform 에서의 지원에 기인하며 다양한 Platform의 선택은 바로 자신의 프로그램의 성능을 높이기 위하여 선택할 수 있는 Platform이 다양하다는 뜻도 된다.

Direct3D 는 주로 게임에서 사용하였다. 거의 대부분이 2D/3D 게임을 위한 API라고 봐도 틀린 말은 아닐 것이다.
Direct3D는 Windows10 및 XBox 에 사용되고 있으며, 이들의 발전에 의하여 그 성능은 OpenGL을 앞서고 있었다.
Microsoft 의 강력한 의지에 의하여 많은 Graphic Card 제조업자들은 Direct3D에 고성능의 기능을 구현해주면서 서로 발전해 왔다.

어느 순간 Direct3D 가 OpenGL 의 성능을 앞서는 싯점이 있었다.

그러나 OpenGL역시 꾸준한 발전을 보이면서 Direct3D 의 상위 기능 구현을 따라가고 있고 이미 준비되어 있으며, 또한 Graphic Card 제조업자들도 이를 따르고 있다.

그러므로 지금의 상태에서는 두가지의 성능 차이는 크게 없다고 볼 수 있다.

Comparison for Programming
일반적으로 Direct3D는 3D 하드웨어 인터페이스를 가상화하도록 설계되었다. Direct3D는 프로그래머가 그래픽 하드웨어를 이러한 인터페이스를 통해서 사용하게 하며, 직접적으로는 사용할수 없게 한다.

한편, OpenGL은 소프트웨어로 에뮬레이션 될 수있는 3D 하드웨어 가속 렌더링 시스템으로 설계되었다.

이 두 API는 근본적으로 다르게 구성되어 있다는 것이다.

따라서 이 두 API의 작동 방식에는 기능상의 차이가 있다. API간 기능적 차이중 하나는 hardware resource를 어떻게 관리하는지에 대한 방법에 있다.

Direct3D는 application이 이러한 일을 하기를 바란다. 그에 반해 OpenGL은 implementation 또는 graphic driver가 관리하기를 바라고 있다.

OpenGL의 이러한 선택은 API 자체를 개발하는데 있어서 어려움을 덜기 위함에 있지만 OpenGL System Driver 작성을 복잡하게 만들기도 한다.

Direct3D를 사용하는 개발자는 하드웨어 리소스를 독립적으로 관리해야 한다. 그러나 이러한 구현은 더 간단하며 개발자는 응용 프로그램에 가능한 가장 효율적인 방법으로 리소스를 할당할 수 있는 유연성을 갖는다. 그러나 많은 API를 이해해야 하며, 각 API에 필요한 각종 인자들을 숙지해야만 한다. 즉 초보자에게는 사용이 어렵지만, 능숙하다면 상당한 성능 향상과 많은 다양한 코드를 만들어 낼 수 있다는 뜻도 된다.


결론적으로 OpenGL은  Resource의 관리가 대부분 Driver 차원에서 이루어 지기 때문에 어플리케이션 개발자는 편리하다.
이에 반해 Direct3D는 이러한 리소스 관리를 프로그래머가 직접 해주어야 하기 때문에 매우 세심한 부분까지 신경써야 하지만, 그럴 준비가 되었다면 보다 최적인 코드를 만들어 낼 수 있다는 뜻이기도 하다.

선택은 각자 해야할일...

댓글 없음:

댓글 쓰기

Vertex , 정점 정보의 확장

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