2009-07-19 20 views
1

でフォーマットされたテキストをレンダリング私は、しかし、私はそれをやって行くのかわからない、いくつかの形式のテキスト(色、異なるフォントサイズ、下線、太字など)をレンダリングする必要があります。 D3DXFontしか...など単一のフォント/サイズ/重量/色/のテキストが一度にレンダリングされる、と私は、このような事をするID3DXFont ::のDrawTextへの複数の呼び出しを「組み合わせる」する実用的な方法を参照してください傾けることができますのDirect3Dアプリケーション

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

これを行うことができるdirect3dフォントレンダラーがない場合は、他のレンダラー(通常のウィンドウでリッチテキストをレンダリングする場合など)があり、それらをRAMのテクスチャにレンダリングしてからビデオにアップロードしますカードをバックバッファにレンダリングすると合理的なパフォーマンスが得られますか?

答えて

3

あなたはDirect3Dのでこれをタグ付けされたので、私はそれがターゲット環境だと仮定するつもりです。さもなければ、GDIはこれらすべてのものを扱うことができます。それが立っている。このようサポートしていますので、

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

Direct3Dでも同じ原則が適用されます。テキストの各塊には、ID3DXFontが十分でない場合はID3DXFont(または独自のフォントメカニズム)と色などが必要な場合があります。

ここで、独自のテキストレンダリングをしたい場合は、シェイダーを使って魅力的なことをすることができますが、本当に高品質のタイポグラフィが必要な場合を除いて、それはおそらく価値がありません。

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

+0

Ok、TextOut :: ID3DXFontがない各ブロックの位置を計算することをサポートしているようです(つまり、各ブロックに対して自分のRECTを計算する必要があります。 ...)。しかし、私は本当にAへの手段が必要で、何かをレンダリングするのにどれくらいのスペースが必要かを事前に計算しています(たとえば、ツールチップボックスを必要なサイズに拡大できます)。必要に応じて垂直スクロールバーを追加するために必要なサイズを計算する機能)。 –

+0

これはGDIで可能ですか?私は必要なもの(すなわち、ボックスに収まるようにラップし、垂直スクロールバーに追加できるようにテキストの「高さ」を調整する)の両方を行う豊富なテキストボックスを備えたアプリをたくさん見ています。 –

+0

Win32でRichEditコントロールを利用しているリッチテキストボックスがあります。このコントロールが利用可能であるため、ほとんどの時間、この低レベル機能をアプリケーションでコーディングする必要はありません。しかし、Win32コントロールのため、Direct3Dでのレンダリング方法はわかりません。 GDIデバイスコンテキストを取得した非表示のDirect3Dサーフェス上でGDI操作を実行することは可能ですが、既存のWin32コントロールをDirect3Dサーフェスにリダイレクトすることに成功した人はいません。 – legalize

0

私は、ビットマップへのレンダリングとテクスチャへのアップロードのパフォーマンスを測定示唆しています。 私はこれがD3DXFontがシーンにふさわしい何をしなければならないかと思っています。 あなたは本当に大きな問題を抱えている早期のDirect3D9を使用したりする場合は

+0

これはフォーマットの問題をいかに正確に解決しますか? –

3

を必要に応じてあなたはおそらくキャッシュ手紙/フレーズなどができます 1.あなたは常に、GDIを使用HDCにテキストをレンダリングする、Direct3Dのにそれをコピーすることダイナミックテクスチャを使用してシェーダを使用して背景を透明に置き換えます(例:カラーキー)。 2. FreeTypeライブラリを見てみると、GDIよりも適しているかもしれませんが、実際には簡単ではありません。

あなたはobligotaryがClearTypeマイクロソフトのテクノロジの理由により、小さいフォントに問題があるでしょう、あなたのレンダリングテキストの良い方法を見つけるだろうしても任意の方法。最初は、(シンボルがこのサブピクセルレンダリングを使用してレンダリングされるため)小さいタイプのシンボルの行列を作成するだけではテキストを入力できません。おそらく特別なシェーダーが必要になるでしょう...ClearTypeの使用を拒否するように強制されますが、小さなフォントではあまり効果がありません。第二に、この技術は、マイクロソフト


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

関連する問題