14

インストールされている TrueType フォントを、OpenGL でテキストを表示するために使用できる一連のポリゴンに変換するライブラリを作成しようとしています。GetGlyphOutline 関数を使用してグリフを一連の輪郭に変換し、glu ライブラリを使用してこれらの輪郭を三角形分割 (テッセレート) します。

通常は機能しますが、常に機能するとは限らず、奇妙な例外があります。GetGlyphOutline は、最初に外側の輪郭を CW の巻き順で返し、内側の輪郭 (穴) を CCW の巻き順で返すことになっています。フォントやグリフによっては、残念ながらそうではありません。外側の輪郭が反時計回りの巻き順で穴が時計回りの場合、または巻き順は正しいが、GetGlyphOutline によって返される輪郭の順序が間違っている場合があります (たとえば、最初に「穴」を取得してから外側の輪郭を取得します)。

これらの奇妙なケースをチェックするために変換を調整しようとしましたが、必要に応じて頂点と輪郭の巻き順を逆にしましたが、ルールはないようで、1 つまたは 2 つの穴のある文字がいくつかのフォントで問題ない場合は、常に例外を見つけます。たとえば、MinionPro-BoldCn という名前のフォントでは、数字の '8' のグリフでさえ GetGlyphOutline によって間違って返され、2 つではなく 1 つだけ穴が開いてしまいます。

また、GetGlyphOutline の代わりに別のメソッドを使用しようとしました。GDI を使用してテキストをパスにレンダリングし、GetPath 関数を使用してそのパスの輪郭を取得します。結果は同じです。特定の文字が GetPath によって返される輪郭の順序や巻き方が間違っているフォントがあります。

誰もこれについて何か経験があり、私にできることはありますか?

4

2 に答える 2

1

完璧な回避策ではないかもしれませんが、1 つのアイデア (反例は考えていません):

  1. 巻き順無視
  2. すべてのグリフをステンシル バッファーに描画し、フラグメントが描画されるたびにステンシル値を 1 ずつ増やします。
  3. シーン上にクワッドを描画し、ステンシル バッファー == 1 のピクセルを塗りつぶします。

私の考えでは、グリフでカバーされていない領域はステンシル値 == 0 になり、グリフ内の領域はステンシル値 == 1 になり、グリフ内の穴はステンシル値 == 2 になります (元のグリフと「穴」で覆われています)。これでフィルタリングして、ステンシルが 1 に等しい領域のみを描画できます。

于 2012-09-05T17:25:46.960 に答える