WebGL内でより高品質の(任意の)テキストを描画する方法を探しています。現在、2Dキャンバスでビットマップフォントレンダリングを使用しており、それらをWebGLコンテキストにブリットしています。
この方法はここで説明されています http://delphic.me.uk/webgltext.html
これは、私が今知っているWebGL内に任意のUnicodeテキストを描画するための唯一のソリューションです。この方法の問題は、これらがビットマップフォントであり、小さいフォントサイズではブロック状に見えることです。私は主に18のフォントサイズを使用しており、結果はデスクトップ品質のフォントと比較してかなりブロック状です。
ThreeJSには見栄えの良いテキストを生成するフォントライブラリがあることは知っていますが、必要なものに対して正常に機能する独自のラッパーがあり、threeJSのオーバーヘッドを追加したくないため、threeJSを使用したくありません。
では、WebGLでより高品質のテキストを作成するにはどうすればよいでしょうか。品質を向上させるためにJavascriptでテキスト形状を抽出する方法はありますか?
しばらくの間フォントを使用した後、WebGLでフォントを作成する6つの方法を見ることができますが、すべて長所と短所があります。
これは「オンデマンドダイナミックテクスチャ」とも呼ばれます。ここで説明するように、テキストグリフのみを(オフスクリーン)キャンバスにレンダリングし、WebGLテクスチャとして画面にブリットします。 http://delphic.me.uk/webgltext.html
ゲームAge of Empires IIIはこの方法を使用します。
限られた文字セットと固定文字サイズ(ゲーム)で最高の速度で最高速度が必要な場合は、使用する文字を特徴とする独自のビットマップを作成し、必要に応じて画面にブリットするのがおそらく最善です。これらの文字ビットマップのかなりの数がインターネット上で事前に作成されています。
これは高速で簡単ですが、使用できる言語と文字が制限されますが、たとえばゲームではこれを気にする必要はありません。
ValveのChrisGreenは、テクスチャに符号付き距離フィールドを使用することに関する「本」を書きました。 2007 SIGGRAPHホワイトペーパーをお読みください "ベクターテクスチャと特殊効果のアルファテスト済み倍率の改善
通常、フォントテクスチャアトラスは this のようになります。 SDFテクスチャは like に見えます。はい、SDFテクスチャアトラスは「現状のまま」レンダリングするとぼやけて見えます。これは、8ビットチャネルが次のようにエンコードされているためです。
smoothstep()
やfwidth()
などのハックは、スクリーンスペースではなくテクスチャスペースで補間するため、スケーリングされた結果の品質が低くなります。また、WebGLのfwidth()
が間違った定数を使用することも助けにはなりません。とはいえ、複数のフォントがある場合、SDFフォントはサイズ(1つだけ必要)と品質(小さいサイズと大きいサイズの両方で見栄えがする)の両方で大きな勝利を収めることができます。
SDFテクスチャとメタデータを生成する使いやすいnpmモジュールがあります ここで入手可能 。
人々は、GPUに三次曲線を保存し、スマートフラグメントシェーダーにレンダリングのすべての面倒な作業を行わせることで、テクスチャを完全にバイパスすることを模索しています。
この blog には、2017年2月現在のフォントレンダリングの概要があります。
現在のプロジェクトでは、HTML5 2Dキャンバスを使用して、テキストやその他の2Dプリミティブをレンダリングし、WebgGLキャンバス上に透明度を使用してオーバーレイします。結果として得られる速度に驚きました。ここで説明する他のすべての方法よりも速度が優れており、品質は非常に優れています。
テキストが静的な2Dであり、3D変換を必要としない限り、これが私の推奨事項です。私のプロジェクトでは、これは以前に使用した方法(Font as Geometry)よりも約2倍高速です。
Three.jsのソースコードを見ると、解決策がわかります。
これがthree.jsフォント作成のコードです https://github.com/mrdoob/three.js/blob/master/src/extras/FontUtils.js
一番上に書いてあります
* For Text operations in three.js (See TextGeometry)
*
* It uses techniques used in:
*
* typeface.js and canvastext
* For converting fonts and rendering with javascript
* http://typeface.neocracy.org
*
* Triangulation ported from AS3
* Simple Polygon Triangulation
* http://actionsnippet.com/?p=1462
*
* A Method to triangulate shapes with holes
* http://www.sakri.net/blog/2009/06/12/an-approach-to-triangulating-polygons-with-holes/
Typeface.jsはフォントデータを提供し、TrueTypeフォントを変換するためのオンラインフォームがあります 。
その他の解決策:
テキストをビットマップとより高い解像度にレンダリングし、その解像度以下で描画します。
カーブレンダラーを使用します。 ( http://http.developer.nvidia.com/GPUGems3/gpugems3_ch25.html )
Pixi.jsは、SDFに関する上記の推奨事項に同意します。
https://github.com/PixelsCommander/pixi-sdf-text
彼らは言います(そして彼らはブラウザにとって優れたゲームプロジェクトです)
SDFは、WebGLでテキストを描画するための最も効率的な方法です。特別な種類のラスターアトラスとGLSLシェーダーを使用して、GPU上で非常にパフォーマンスの高い方法でベクトルスケーラブルテキストを描画します。
そして this は、少なくともある時点でそれを行ったMapBoxからのものでした。