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による書き込みがうまくいっていないような気がする。