2011-01-11 11 views
0

これまでのようなトピックを作成しましたが、これはビットマップフォントレンダリングの最も基本的なアプローチの最初から最後までです。私は誰かが私がここで間違っていることを見ることができることを望んでいます。基本ビットマップフォントレンダリング

これは長いポストですが、Bug#1が修正されるとすべて修正される可能性があります。この質問はC#(Bug#1)とC++(Bug#2、Bug#3)を扱っています。私はC#でサイズ2056x2056でビットマップを作成する)二つのもの

1をやってレンダリングするビットマップフォントのための

。私は最初に512x512イメージに文字を描画してから、イメージを128にサイズ変更しています。これを行うのは後でテキストに影響を与えるためです。これはまた、Bug#1(以下を参照)を導入します。

2)文字ごとに個別の矩形を描画する(Bug#2とBug#3を参照)。

私が抱えている問題は、シーケンス内の完全な文字を正しくレンダリングすることです。 UVの問題や文字間隔の問題があります。今すぐバグに

バグ#1:フォントサイズ 私は512pxグラフィックにレンダリングするフォントは120です。グラフィックのサイズを変更するサイズは128で、これは4倍です。そこで、私はフォントサイズが30になると期待しています。ビットマップを保存した後、調査するためにGIMPで調べます。私がやることの1つは、GIMPの文字をビットマップの文字に描くことです。興味深い結果が得られますが、間違っているかどうかはわかりませんが、下の画像からわかるように、GIMPに文字を "30pt"で描画させるのが正しい描画ですが、 "30px"で描画するとかなり小さくなります。なぜこれが重要なのかは、後でC++でマップモードを "SetMapMode(dc、MM_TEXT);"に設定するためです。 MSDNで詳しく説明していますが、MM_TEXTは「各論理ユニットが1つのデバイスピクセルにマップされています」となっています。

それはGIMPは "30pt" を "40ピクセル" に変換することが判明しました。その結果、私のC++コードでは、MapModeをピクセルテキスト設定に設定しているので、サイズ「40」のフォントを作成します。これが、バグが最初に修正されることが非常に重要な理由です。このバグが修正されると、#1と#2のバグが修正される可能性があります。

私の質問はBug#1に間違っていますか?マップモードを別のものに設定する必要がありますか?キャラクターを512ピクセルのグラフィックに描画し、グラフィックのサイズを変更します。これは重要なステップですので、キャラクターのより大きなバージョンに効果を及ぼすことがあります。

バグ#2:UVの 私は128ピクセルごとに文字を保存するので、各文字のビットマップX/Y値を取得するのは非常に簡単です。しかし、私はUVを適切に描くためにどのくらい遠くまで進むべきかはわかりません。私は基本的には、AngelCodeビットマップフォントレンダリングのために投稿されたPromitのようなことをやってみましたが、値の生成方法がわからないのでここで間違っているかもしれません。下の2つの画像で、自分のUVを間違って計算していることがわかります。

私の質問はBug#2ですが、どうすれば私のUVを正しく進めることができますか?私がビットマップX/Yを見つける方法には何も問題はありません。レンダリングのためにそれらをどのように動かすかだけです。

バグ#3:文字の配置 私のキャラクターを動かす方法を修正したり、正しく距離を取得する方法がわかりません。現在私はちょうど "A + B + C"をしています。しかし、このマップは正しいようですが、下のArial画像を見ると、 "j"は "n"と "f"の間で外れて見えます。またArialの "b"と "y"の問題とTimes New Romanの問題もあります。

バグ#3への私の質問は、どのように正しく文字を進めることができますか?

Arialのレンダリング:

のTimes New Roman:

それは私がこれを行うには(などのFreeTypeなど)任意の外部ライブラリ、または任意の "ハック" を使用することに興味がないことは注目に値します。私はこれがwindows apiを使って正しく行われていることを確認したい。これらのどちらかをやっているのは議論の余地がありません。もし私がそれらを使いたいのであれば、これはずっと前にやっていたかもしれません。

ボードのソースタグが壊れているので、サンプルソースをpastebinsに投稿します。

のC#(ビットマップ描画):http://pastebin.com/zpPPZVm0 C++(フォントレンダリング):http://pastebin.com/mHrUatEb

答えて

1

1 - 点と画素が異なる単位です。そこでバグはありません。説明のために "fonts points pixels"を検索してください。

3 - 比例フォント(Arialなど)では、各文字の幅が異なります。より高度なsceanriosでは、文字の組み合わせは個々の幅の合計に比べて異なる幅を持つことができます。 MeasureString(http://msdn.microsoft.com/en-us/library/system.drawing.graphics.measurestring.aspx)で読み始めることができ、フォントレンダリングに関する関連記事を読むことができます。

+0

私はこの情報を読んでいましたが、MeasureStringのようなものはC#ではなく、C++ではなく、私が必要なところで言ったようなものです。また、個々の文字に対してMeasureStringを使用すると、GetCharABCを使用する場合と同じ情報が表示されます。 – jack

+0

MeasureStringのネイティブバージョン - http://msdn.microsoft.com/en-us/library/ms535831(VS)もあります。 85).aspx。しかしあなたの他の質問を見て、あなたはすでに情報を読んでいます。私はもっ​​と助けることができない... –