OpenGL、FTGLのフォントの概要


8

ゲームでフォントをレンダリングするためにFTGLライブラリを使用していますが、テキストの周囲にアウトラインを作成する方法がまったくわかりません。影の作成は、次のように簡単にできるので簡単です。

(疑似コード)

font.render(Color::BLACK, position.x + 1, position.y + 1); // Shadow
font.render(Color::WHITE, position.x, position.y)          // Normal text

しかし、アウトラインを作成する方法は?残念ながら、インターネットでそれに対する興味深い解決策を見つけることはできませんでした。かなり奇妙に思えましたが、これは非常に人気のある問題だと思っていました。

大きなフォントだけでアウトラインを描くのは正しい方法ではありません。私が知ったように、この場合は文字が一致しないからです。

ここに画像の説明を入力してください

では、フォントのアウトラインを作成する簡単な方法はありますか?彼らは実際のゲームでそれをどのように行うのですか?

どんな答えも事前にありがとう


1
たとえば、同じテキストをテクスチャーにレンダリングしてから、このテクスチャーをx1.2に拡大してレンダリングするというのは、汚い解決策です。
ダン

2
@ダンそれは彼が上の彼のイメージで示したものに正確につながるでしょう。このように一度に1文字ずつレンダリングしても、外側の輪郭が内側の輪郭よりも太くなるため(存在しない可能性があります)、問題が発生します。
エンジニア

1
どのタイプのフォントを使用していますか?FTGLは、ベクターフォントのボックス外のアウトラインフォントをサポートしています。OpenGLの線幅を使用して太さを制御できます。
Paul-Jan

回答:


7

柔軟で正確:フィルター

CPU側のテクスチャ、またはプログラム可能なパイプラインOpenGLを使用している場合は、フラグメントシェーダーで直接、テクセルフィルターを使用します。

フィルターの考え方は、2Dループを実行してすべてのテクセルを処理することです。それが白の場合は、一定の半径で周囲のピクセルごとに内側の2Dループを実行し、それに応じて調整します。これはボックスフィルターとも呼ばれますが、半径チェックを含めると、それは実際には円形フィルターであり、軸方向のアーティファクトを回避します。

これを行うためのより速い方法は、チェックする各中心ピクセルからのオフセットのセットを事前計算することです。この方法では、特定のピクセルを囲むすべてのピクセルに対して平方根を実行する必要はありません。言い換えれば、複雑さをO(texWidth * texHeight * filterRadius * filterRadius)ではなく、 `O(texWidth * texHeight)に抑えたい、ということです。

簡単:複数のレンダリング

効果を実現するもう1つの方法は、テキストを拡大縮小するのではなく、8つの方向(またはそれ以上)のそれぞれで赤いアウトラインをレンダリングすることです。

 \|/
--+--
 /|\

このように赤のバージョンをそれぞれオフセットすることにより、元のテキストの周囲にかなり均一な外縁ができます。斜めにシフトするときは、同じxとyの値だけオフセットするのではなく、水平または垂直にシフトするときと同じベクトルの大きさを使用する必要があることに注意してください(これにより、長さが約1.4倍長くなります-基本的なトリガー)。

ご参考までに

この種の効果は膨張と呼ばれ、前述のピクセルベースの(量子化された)ボックスフィルターに対するベクトルベースの(連続的な)アプローチであるミンコフスキー合計によって実行されることもあります。


6

この機能はFTGLに直接実装されていますが、ExtrudeFontクラスでのみ使用できます。フォントのアウトセットを定義するだけです。

font = new FTExtrudeFont(...);
font->FaceSize(80);
font->Depth(0);
font->Outset(0, 5);

次に、2つのレンダリングモードに異なる色を使用できます。

glColor3f(1.0, 1.0, 1.0); /* White inside */
font->Render("Hello", FTPoint(), FTPoint(), FTGL::RENDER_FRONT);
glColor3f(1.0, 0.0, 0.0); /* Red outline */
font->Render("Hello", FTPoint(), FTPoint(), FTGL::RENDER_SIDE);

アンチエイリアスのオンとオフを切り替えた結果は次のとおりです。

結果の画像


サムありがとう!それは私が本当に聞きたかったことです-そのFTGLは実際にこのようなものを持っています。もう一度ありがとう。
Piotr Chojnacki

2

FTGLとは関係ありませんが、Valveからグリフのレンダリングに関する優れた記事があります。少ないメモリ要件で高品質のレンダリングを提供し、アウトラインやシャドウなどの効果を簡単に実装できます。


2
このアプローチには、プログラム可能なGPUパイプライン、つまりシェーダーの理解が必要であることをOPに警告する価値があります。
エンジニア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.