DirectWriteでD3D11のテクスチャに日本語を書き込めた

Windows8 SDKのサンプルを使って、テクスチャにDirectWriteで(D3D10関係を経由せず)書き込み、
それをDirect3Dのオブジェクトに張り付けて表示できた。D3D10じゃなくてD3D11のみで。

  • まずID3D11Texture2Dのテクスチャを用意。
  • ID3D11Texture2D::QueryInterface()でIDXGISurfaceを取得
  • それをID2D1DeviceContext::CreateBitmapFromDxgiSurface()に渡してID2D1Bitmap1を取得。
  • それをID2D1DeviceContext::SetTarget()に渡せばID2D1DeviceContextの書き込み先がテクスチャになる。
  • つまりDirectWriteで書き込める。
  • 途中何か所かDXGI_FORMAT_R8G8B8A8_UNORMをDXGI_FORMAT_B8G8R8A8_UNORMに置き換えたりD3D11_CREATE_DEVICE_BGRA_SUPPORTを追加したりした。

DirectXTKサンプルのDirectX::Colors名前空間で定義されている141色(XMVECTORF32)を表示してみた。
141色といっても同じRGB値で違う名前がついているもの(AquaとCyan)もある。Transparentもある。

Windows8+DirectX11(11.1には非対応のビデオカード)の環境で実行。
テクスチャは使いまわしで、フレーム毎に
DirectWriteでテクスチャに文字を描画→DxTKのSpriteBatch::Draw()でスワップチェインにテクスチャを描画
を141回行っている。DxTKを使ったTeapotの描画は1フレームあたり1回だけ。
このとき1フレーム描画にかかる時間は306msで3.2fps。そりゃ重い。
あとTransparentのテクスチャへのDirectWriteによる書き込みがうまくいっていないような気がする。