거의 9년 전에 그래픽스 관련 공부를 하면서 남겼던 메모들입니다.
문자열을 출력하는 방법
DirectX 8
- ID3DXFont 인터페이스 이용
LOGFONT를 이용해 폰트의 속성을 지정한 후 D3DXCreateFontIndirect()를 호출하여 생성함. 그런 다음 DrawText()를 호출하면 출력됨. - D3DXCreateText 함수 이용
역시 LOGFONT를 이용하고 CreateFontIndirect(), D3DXCreateText()를 호출하여 생성함. GDI를 이용하는 방법임. ID3DXMesh::DrawSubset(0)를 호출하면 출력됨.
DirectX 9
- ID3DXFont 인터페이스 이용
DX8에서와 달리 D3DXFONT_DESC를 이용해 폰트의 속성을 지정해야 함. - D3DXCreateText 함수 이용(3D 텍스트)
DX8과 동일함.
DirectX 10
- ID3DX10Font 인터페이스 이용
DX9와 동일.
DirectX 11
기존의 D3DXFont 등의 인터페이스들이 모두 없어져서 글자들을 모은 스프라이트 형태의 이미지를 이용하는 방법 밖에 없음.
- * FW1FontWrapper 라이브러리(외부) 이용
- * DirectX Tool Kit 라이브러리(외부) 이용
입체도형을 그리는 방법
정점에 관한 정보와 정점의 연결순서에 관한 정보를 각각 Vertex 버퍼에 집어넣은 후 프레임을 렌더하는 단계에서 해당 도형을 그리는 함수를를 호출해 2차원 좌표계에 그리도록 한다. 보통 3차원 좌표정보와 3차원 벡터 구조체를 포함하도록 하는 임의의 Vertex 타입을 따로 정의해야 함.
DirectX 8
정점과 연결순서 각각의 정보를 CreateVertexBuffer()를 호출해 버퍼를 생성한 후 VertexBuffer->Lock(), memcpy(), Unlock()을 이용해 실제로 메모리에 담는다. 그런 다음 렌더 단계에서 SetStreamSource(), SetIndices(), DrawIndexedPrimitive()를 순서대로 호출하면 입체가 그려진다.
DirectX 9
DX8과 비슷하나 버퍼에서 Lock()을 호출할때의 인자들 중 정점과 연결순서에 대한 포인터의 타입이 BYTE*에서 VOID*로 바뀌었음.
임의로 만든 Vertex 타입을 등록할 때 DX8에선 SetVertexShader()를 이용했지만 DX9에선 SetFVF()를 이용해야 한다.
DirectX 10
DX8, DX9와 달리 D3D10_BUFFER_DESC를 이용해 버퍼의 속성을 정하고 D3D10_SUBRESOURCE_DATA에 버퍼의 내용을 집어넣은 다음에 CreateBuffer()를 호출하여 버퍼를 생성함. 그런 다음 프레임 렌더 단계에서 UpdateSubresource()와 DrawIndexed()를 호출하면 입체가 그려짐.
DirectX 11
DX11과 유사하나 D3D11_MAPPED_SUBRESOURCE와 D3D11_BUFFER_DESC를 이용해 버퍼를 정의하고 ID3DDeviceContext::Map()과 UnMap(), 그리고 memcpy()를 이용해 버퍼를 생성함. 프레임 렌더단계에서는 DX10과 동일함.
기타 정보
DX8, 9에서는 IDirect3D, IDirect3DDevice, IDirect3DIndexBuffer, IDirect3DVertexBuffer 까지만 준비하면 프로그램을 만들 수 있다.
DX10부터는 상수 버퍼의 개념과 함께 ID3DInputLayout, ID3DPixelShader & ID3DVertexShader, ID3DDepthStencilView & 깊이 스텐실용 버퍼, ID3DRenderTargetView, IDXGISwapChain 개념이 추가되었다. 셰이더 개념과 뷰의 성격에 따른 분리 등 중요한 개념이 생긴 것.
DX11에서는 멀티쓰레딩 환경에 대응하기 위해 하드웨어 정보와 관련된 부분은 ID3DDevice에 남겨두고 렌더링과 관련된 부분은 ID3DDeviceContext로 분리해 관리한다. 컨텍스트는 Immediate 타입과 Deferred 타입으로 나뉘어 다뤄진다.
DX11만으로 작성한 예제: