日別アーカイブ: 2008年12月7日

Direct3D11/DirectX11 (17) GPU を使ったアウトラインフォントの描画の(5)

やっとフォントデータ丸ごとコンバータを通るようになりました。

tess font 82
tess font 81

表示は Direct3D11 beta + RADEON HD4850
ハードウエアで動かすために GeometryShader 4.0 を使っています。
Reference Driver なら GeometryShader ではなくテセレータを使用可能。

fps 表示もアウトラインフォント

tess font 80

プロポーショナルフォントの処理が無いので字間が少々おかしい。

CPU Rendering の WARP Driver でも 30fps くらいは出ます。
Reference Driver だと 2.4fps 程度。
(WindowsVista x64 Core2 Duo)

頂点形式は float2 x4、これを 4頂点で 1パッチとして描画しています。
4頂点なら LINELIST_ADJ で GeometryShader に渡せます。

px py  c0x c0y  c1x c1y  tscale cx
px py  c0x c0y  c1x c1y  tscale cy
px py  c0x c0y  c1x c1y  tscale 0
px py  c0x c0y  c1x c1y  tscale 0

1頂点が 1エッジに相当します。tscale はテセレータに対する係数。
係数が 0 だと分割しないので直線部分に使用します。
カーブが急な部分、エッジが長い部分は係数を大きくするなどの調整も可能です。

cx cy はパッチの中心座標を埋め込んだもの。

フォントデータは SVG か FXG を使用しています。glyph や path 等。
パス情報自体はほぼ同じ形式なのでデコード処理は共通化できます。
使用していませんが XAML も attribute に埋め込まれたパスの書式は同一でした。
内外判定は NonZero 相当。自己交差したパスは未対応。

Paths SVG 1.1
FXG 1.0 Public Specification
パス マークアップ構文

関連エントリ
Direct3D11/DirectX11 (16) GPU を使ったアウトラインフォントの描画の(4)
Direct3D11/DirectX11 (15) GPU を使ったアウトラインフォントの描画の(3)
Direct3D11/DirectX11 (14) GPU を使ったアウトラインフォントの描画の(2)
Direct3D11/DirectX11 (10) テセレータの補間
Direct3D11/DirectX11 (9) テセレータによるアウトラインフォントの描画など
Direct3D11/DirectX11 (8) テセレータの動作