Direct3D

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

Direct3D(다이렉트3D)는 마이크로소프트DirectX API에서 3차원 그래픽스 연산과 출력을 담당하는 부분이다. 마이크로소프트의 윈도 운영 체제(윈도 95 이상)에서만 작동하며, 엑스박스엑스박스 360 게임 콘솔의 그래픽 API로 사용되고 있다. 다이렉트3D와 비슷한 역할을 하는 API로는 OpenGL이 있으며 역할은 같지만 각자가 서로 다른 장단점을 가지고 있다. 이에 대해서는 Direct3D와 OpenGL의 비교를 참고하기 바란다.

역사[편집]

1992년 렌더모픽스(RenderMorphics)라는 회사에서 리얼리티 랩(Reality Lab)이라는 3차원 그래픽스 API를 만들기 시작했다. 1995년 2월에 마이크로소프트윈도 95에 쓰일 3차원 그래픽스 API를 위하여 런더모프스 사를 인수했고, DirectX의 2.0 버전에서 처음 다이렉트3D가 도입되었다.

당시의 Direct3D는 하드웨어 제조사들이 지원하기 쉽도록 "실행 버퍼" 모델을 사용하고 있었는데 이는 프로그래머들에게 많은 불편을 야기했다. 다이렉트3D 5.0 버전에서는 DirectPrimitive API를 도입하여 실행 버퍼 모델을 대체하였다.

Direct3D 6.0 버전에서는 당시 최신 하드웨어를 지원할 수 있도록 많은 기능이 추가되었다. x86, SSE, 3DNow를 위해 지오메트리 파이프라인이 최적화되었으며 간단한 텍스처 관리 기능이 추가되었다.

Direct3D 7.0에서는 .dds 텍스처 파일 포맷이 도입되었으며, 하드웨어 변환 및 조명 기능이 추가되었다.

Direct3D 8에서는 다이렉트드로를 독립적인 API로 분리시켰다. 버텍스 셰이더픽셀 셰이더가 지원되기 시작하였으며 이로 인해서 범프 매핑 등과 같은 고급 그래픽 효과를 사용할 수 있게 되었다.

Direct3D 9에서는 독자적인 셰이더 언어(HLSL) 를 지원하기 시작하였다. 이로 인해서 HDR, 정점 버퍼 인덱싱과 같은 기능을 사용할 수 있게 되었다.

Direct3D 10은 구조를 대폭 정리하는 등의 큰 변화를 거쳤다. 윈도 비스타에 포함되어 있고, 하위 버전과의 호환성은 없다.

디스플레이 모드[편집]

다이렉트3D는 다음의 두 가지 화면 방식을 제공한다:

  • 전체화면 모드: 다이렉트3D 응용 프로그램은 디스플레이 장치로 모든 그래픽 출력을 만들어 낸다. 이 모드에서 다이렉트3D는 자동으로 Alt-Tab을 잡아 내고 화면 해상도와 화소 포맷을 프로그래머가 관여하지 않아도 설정하고 복원한다. 또한 '예외 합동 방식'(Exclusive Cooperative Mode) 때문에 오류를 찾아내고 수정하는 데에 많은 애를 먹을 수 있다.
  • 창 모드: 결과물은 창 영역 안 쪽에 보인다. 다이렉트3D는 GDI와 데이터를 주고 받으며 디스플레이의 그래픽 출력을 만들어 낸다. 드라이버 지원에 따라 창 모드는 전체 화면과 동일하게 수행할 수 있다.

파이프라인[편집]

  1. 입력 어셈블러
  2. 버텍스 셰이더
  3. 지오메트리 셰이더
  4. 스트림 출력
  5. 레스터라이저
  6. 픽셀 셰이더
  7. 출력 병합

예제[편집]

다이렉트3D로 삼각형 그리기:

 // A 3-vertex polygon definition
 D3DLVERTEX v[3];
 // Vertex established
 v[0]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x00FF0000, 0, 0, 0 );
 // Vertex established
 v[1]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x0000FF00, 0, 0, 0 );
 // Vertex established
 v[2]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x000000FF, 0, 0, 0 );
 // Function call to draw the triangle
 pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, v, 3, 0 );

다이렉트3D 9로 삼각형 그리기:

 struct Vertex { float x, y, z; D3DCOLOR color; };
 Vertex triangle[] = {
  { 0.f, 5.f, 10.f, 0x00FF0000 },
  { 0.f, 5.f, 10.f, 0x0000FF00 },
  { 0.f, 5.f, 10.f, 0x000000FF }
 };
 // set Flexible Vertex Format
 pDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
 // Draw - UP stands for 'user pointer', that is data 
 //is provided through a pointer and not through buffers
 pDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, triangle, sizeof(Vertex));

같이 보기[편집]

바깥 고리[편집]