« Unity での日本語描画 その1 | メイン | Media Foundation で H.264 デコード後の画像を得る »

2014年06月19日

Unity:: Unity での日本語描画 その2 テクスチャ仮想多重化

    

2048x2048 のサイズのテクスチャで 64x64 サイズのフォントを入れようとしたら入るのは 1024個。
少し少ない。
32x32 サイズなら 4096個なので、実際に使用されている文字に限定すれば入りそうだ。
JIS 第一水準、第二水準漢字を入れようと思ったら、6355文字必要になる。
英数字も加えるともう少し増える。
これが入る限界サイズは 25x25 辺り。

出来れば 64x64 サイズくらいで詰め込みたいところ。
1ビットアルファとして、文字を詰め込めば 8192 文字入る。
ただ、単純に1ビットで敷き詰めるとシェーダーで取り出すのは困難なので、8層あるとみなして詰め込む。
つまり、最上位1ビットだけ使って 2048x2048 の中に文字を並べ、次に2ビット目に~と並べていく。
するとこんな感じのファイルが出来る。

glyph_20140619.png

アルファに重なっているのでそのままでは読み取れない。
これをシェーダーで取り出す。
ビット演算が使えれば楽だけど、シェーダーバージョン次第で使えないようなので四則演算で取り出す。
最下位ビットは以下の形で取り出せる。

int alpha = int(texcol.a*255.0);
int c0 = alpha / 2;
int c1 = c0 * 2;
int bit = alpha - c1;
texcol.a = float(bit);

アルファ値が 1 か 0 で取得可能。
2ビット目が欲しければ、alpha を最初に2で割る。
以降2の累乗値で割れば、任意ビット位置のアルファ値が得られる。
描画してみるとこんな感じ。

unity_font_20140619.png

補間はまだ書いてないが、後は補間処理を書いて、板ポリゴンに貼り付けるようにしていけば文字描画できるようになる。
PC なら 24 ピクセルくらいになるだろうから、補間でアンチエイリアスがかかった文字になり綺麗に見える。
高繊細ディスプレイなら 64 以上のピクセル数になると思うが、そこそこ綺麗に見えるのではないかと思う。

後、この方法を用いればパレット形式のテクスチャも使えそうだ。
RGBA の各チャンネルでインデックス指定、テクスチャの1ライン目にパレット格納と言う形にすれば、4面分使える。
パレット形式をシェーダーで問題なく使えるか後日試そうと思う。



投稿者 Takenori : 2014年06月19日 23:11




comments powered by Disqus
Total : Today : Yesterday : なかのひと