DirectX 9の描画命令 (1)

DirectX Graphicsの高レベルAPIがどの低レベルAPIに依存しているかの関係図」を描くための予備資料と言うことで『KMC春合宿2004 in 花背山の家』で使ったリストを掲載.とはいってもヘルプにある情報を適当に分類して並べただけの代物なんだけど.
ここで言う描画命令とは呼び出すことがレンダーターゲット*1の変化に直接結びつくもので,DirectX Graphicsのヘルプに載っているAPIを対象とすることにする.
まずは真の意味で描画命令と呼べるものから.これらはドライバの規格と対応しており,ユーザプロセスではこれ以上の細かい粒度は得られない.これらIDirect3D〜という名前を持つインターフェイスのみで構成されたAPIセットこそ,DirectX Graphicsという規格の最も小さいサブセットと言える.

  • IDirect3DDevice9::Clear
  • IDirect3DDevice9::ColorFill
  • IDirect3DDevice9::DrawIndexedPrimitive
  • IDirect3DDevice9::DrawIndexedPrimitiveUP
  • IDirect3DDevice9::DrawPrimitive
  • IDirect3DDevice9::DrawPrimitiveUP
  • IDirect3DDevice9::DrawRectPatch
  • IDirect3DDevice9::DrawTriPatch
  • IDirect3DDevice9::StretchRect
  • IDirect3DDevice9::UpdateSurface
  • IDirect3DSurface9::GetDC
  • IDirect3DSurface9::LockRect

一方以下が擬似描画命令.これらは本質的にはただのユーザレベル関数*2であり,当然自前のコードで置き換えることが可能である.疑似描画命令のパフォーマンスが悪かったからといって,ドライバレベルでの仕様を策定するDirectXコアチームに責任はない.だた,SDKに同梱されていることで初心者が混乱しやすいという業を背負う.

  • ID3DXFont::Draw
  • ID3DXLine::Draw
  • ID3DXMesh::DrawSubset
  • ID3DXSprite::Draw
  • D3DXLoadSurfaceFromFile
  • D3DXLoadSurfaceFromMemory
  • D3DXLoadSurfaceFromSurface

重要なのは2点.ただし具体的な説明は次の機会に.

  1. 真の描画関数のパフォーマンス特性を知ること
  2. 疑似描画命令を使うなら,それが依存している真の描画命令を見抜くこと

*1:描画先サーフェイス.PresentModeに依存しない議論をしたいので,バックバッファとは言わないことにする

*2:実体はd3dx9.lib等にあって基本的にスタティックリンクされる