くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2014-08-25

日記

気が抜けてしまっていろいろやる気が出ない。

ちょっと気合い入れないとな。

[OpenGL][Ruby] 文字の読み描きその3

TrueTypeフォントの読み込みはなんとなく出来たので描画していたが、思ったより苦労した。

TrueTypeのアウトライン情報には制御点ごとにOn CurveかOff Curveかの情報がある。On curveの点は曲線の端点で、off curveは曲がり具合の制御点だ。ということで読み込んでみるが、on off off onのようにoff curveの点が連続するところがしょっちゅうあった。 TrueTypeは二次ベジエ曲線だったはずだから制御点は端点含めて3点になるはずでは?これじゃ4点になっちゃうなぁ。

二次ベジエ曲線というのは勘違いだったのかと三次のベジエ曲線も描けるようにしてみたが、今度はoff curveな点が5個連続する箇所が出てきてしまった。これおかしい、絶対おかしいよ。

仕様を読んでたけどどこにも詳しいことが書かれておらず困ったのでWebを調べてみると、off curveな点が連続した場合はその中点にon curveな点があることにするよ、とのこと。おいそれ仕様のどこに書いてあったよ?Glyph回りの仕様ははっきり書かれていないことが多くてひどいよ……。とにかくこのルールに従うと二次のベジエ曲線にできるわけだな。

そこまでわかったらあとは簡単だった。glBeginとか久々に使ったからそのあたりを思い出さないといけなかったとかその程度だ。

OpenGLでの描画方法はステンシルをInvertにして、端っこの頂点から各辺への三角形を描きまくり、あとはステンシルが0じゃないところだけ塗り潰すとなぜか上手いこと描画できるという簡単な方法である。これ考えついたひとすごい。

文字の描画結果

上がMSAA×2、下がアンチエイリアス無し。AA無しは全く何も考えずに描いただけなのでさすがにジャギーだ。とはいえこのサイズだったらまあいいかなぁという気がしなくもない。

小さい文字の描画結果

こっちはもっと小さく描いた場合。同じく上がAA有り、下がAA無し。AA無しは潰れて「描」の下や「画」の上が細くなっちゃってる。横は意外と大丈夫なもんだな。まあこれ以上小さくなったら横方向もまずいだろうが。 これはさすがにまずいのでやっぱりなんらかのアンチエイリアス処理は必要なようだ。

潰れちゃうのに対してFXAAみたいなポストエフェクトなAAは使えないから、MSAAかスーパーサンプリングみたいな大きく描く方法しかないかなぁ。大きく描きすぎない方法だと一回り大きく描いてエッジをフェードしてやればいいと思うんだけど、言う程簡単じゃなさそうな気もするな。

描画方法も今のだと2パス必要だから、なんとか上手いこと三角化する方法も考えた方がいいだろうか。最終的にビットマップにキャッシュするならそんな必要もないのかな。まあ速度についてはあとで考えるか。


ページのトップへ | トップ «前の日記(2014-08-16) 最新 次の日記(2014-09-10)» | 編集 | kumaryu.net by kumaryu