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

投影されるスクリーンのピクセル長から TessFactor を求めるように変更。
これを曲率で補正します。
前回の頂点形式の tscale はそのまま曲率を意味するようになりました。
この値を無視すれば直線部分も分割可能。

tess font 90

拡大してもフォントが荒れず、同一フォント内でもエッジの長さや奥行きに応じて変わります。
ただし分割数は GS だと限界があります。
GeometryShader の出力は最大 1024 float なので、仮に出力が最小の float4
SV_Position のみとしても 1エッジあたり 21 分割まで。
21 * 3 vertex * 4 edge = 252
252* 4 float = 1008
↑負荷は軽くなったけど TessFactor の求め方はまだまだ改良の余地あり。

tess font 91

↑直線部も均等に割ってランダムな振動を加えたもの。(WARP)
2D のディスプレースメントマップのような感じ。
エッジをじりじり動かせます。手書きアニメーション風の表現とかできるかも。
コンバータにはかなり苦労したけど、実際に画面が出て動くようになるとさまざまな
応用ができて楽しい。

描画が軽いうちは WARP デバイス (D3D_DRIVER_TYPE_WARP) はかなり使えます。
ステートの組み合わせを間違えても GPU がハングアップすることがないので、
いろいろ実験したりテストするとき 精神的 に楽です。

GPU がハングアップすると画面が停止して何もできない状態に陥ります。
たいていはドライバがタイムアウトすると GPU をリセットするので
しばらく待っていれば復活します。
でもうっかりミスだったりするとこの待ち時間が後悔の時間。万が一復活しない場合は
たとえ内部で正常に動いていてもリセットが必要というプレッシャーも。
短時間でも画面のフリーズは無い方がよいです。

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