1

書式設定されたテキスト (色、さまざまなフォント サイズ、下線、太字など) をレンダリングする必要がありますが、その方法がわかりません。D3DXFont では、単一のフォント/サイズ/太さ/色/その他のテキストのみを一度にレンダリングできます。ID3DXFont::DrawText への複数の呼び出しを「組み合わせて」そのようなことを行う実用的な方法はわかりません...

周りを見回したところ、これらのことを行う既存のライブラリはないようですが、そのようなテキストレンダラーを実装する方法がわかりません。また、そのようなテキストレンダラーがどのように機能するかについてのドキュメントも見つかりませんでした.単純な固定幅の ASCII ビットマップ フォントのみをレンダリングすることは、おそらくまったく異なるアプローチであり、Unicode が重要でないテキストの単純なブロックをレンダリングする場合にのみ適しています。

これを実行できる direct3d フォント レンダーがない場合、他のレンダラー (たとえば、通常のウィンドウでリッチ テキストをレンダリングするために使用するもの) はありますか?それらを RAM 内のテクスチャにレンダリングし、それをビデオ カードにアップロードしてレンダリングします。バックバッファは妥当なパフォーマンスをもたらしますか?

4

3 に答える 3

3

Direct3D9またはそれ以前を使用する場合、本当に大きな問題が発生します。1.常にGDIを使用し、HDCでテキストをレンダリングし、Direct3Dダイナミックテクスチャにコピーし、シェーダーを使用して背景をカラーキーで透明に置き換えます。2. FreeTypeライブラリを見てみると、GDIよりも適していると思われるかもしれませんが、実際には簡単ではありません。

いずれにせよ、テキストレンダリングの優れた方法を見つけたとしても、ClearType Microsoftテクノロジが原因で、小さなフォントで問題が発生する可能性があります。最初は、小さな記号のマトリックスを作成してそこからテキストを入力することはできません(記号はこのサブピクセルレンダリングを使用してレンダリングされるため)。おそらく特別なシェーダーが必要になります...またはClearTypeの使用を拒否するように強制されますが、前に述べたように、小さなフォントには悪い後遺症があります。第二に、このテクノロジーはマイクロソフトによって特許を取得しています


ただし、Windows XPのサポートが必要ない場合は、DirectWriteおよびDirectX10でDirect2Dを使用してみてください(私は11を試しませんでした)。私はそれらを試しましたが、良い結果が得られました。パフォーマンスが大幅に低下する可能性があるため、Direct2DコンテキストとDirect3Dコンテキストを頻繁に切り替えることは避けてください。テクスチャに何かをレンダリングするには、ID2D1Factory::CreateDxgiSurfaceRenderTarget関数を使用できます

于 2010-04-02T08:21:24.933 に答える
3

これを Direct3D でタグ付けしたので、それがターゲット環境であると仮定します。それ以外の場合、GDI はこれらすべてを処理できます。

実際には、GDI を見ることから始めるのが良いでしょう。GDI はこれをそのままサポートしているためです。GDI では、テキストを描画するために一度に選択できるフォントは 1 つだけです。同様に、一度に選択できるテキストの色は 1 つだけです。したがって、複数の色やフォントの文字を含むテキスト行を描画するには、その行をすべて同じレンダリング状態を持つ文字のチャンクに分割する必要があります。::TextOutそのチャンクの状態 (テキストの前景色/背景色、テキストのフォント、テキストの間隔など)を設定し、そのテキストのチャンクを呼び出し、次のチャンクの状態を設定して描画します。

Direct3D にも同じ原則が適用されます。テキストの各チャンクには、独自のID3DXFont(または十分でない場合は独自のフォント メカニズムID3DXFont) と色などが必要になる場合があります。状態を設定し、テキストを描画し、状態を設定し、テキストを描画します。

独自のテキスト レンダリングを行いたい場合は、シェーダーを使用してより洗練された処理を行うことができますが、本当に高品質のタイポグラフィが必要でない限り、おそらく価値はありません。

Windows 7 (Windows 7 の出荷後に Vista 用に埋め戻されます) では、Direct3D レンダリング コンテキスト (D3D10 以降) で高品質のタイポグラフィに DirectWrite を使用できます。

于 2009-07-20T02:23:05.810 に答える
0

ビットマップへのレンダリングとテクスチャへのアップロードのパフォーマンスを測定することをお勧めします。とにかく、これは D3DXFont が舞台裏でやらなければならないことのほとんどだと思います。必要に応じて、おそらく文字/フレーズなどをキャッシュできます

于 2009-07-21T10:30:17.857 に答える