気ままに、てげてげに。2008年9月27日土曜日とりあえずできたが、とりあえず、GetGlyphOutlineでグリフイメージを取得してテクスチャにして、四角いポリゴンに貼るところまではできた。α値のみのテクスチャ。GetGlyphOutlineでアウトラインフォントをポリゴン化したもの。曲線部分は3つの直線に分割して近似、ポリゴン数106、頂点数104。右下の小さいのは、これのワイヤーフレーム表示。ここまで大きく表示すると、さすがにフォントサイズ100でも、荒さが目立つ。それに対して、ポリゴン化したやつは、近似が荒いわりには意外ときれいに見える。速度的には、やっぱりテクスチャのほうが速いのだろうか。半角文字ならサイズ半分なんだろうけど、そこはひとまずおいといて、256文字だと合計で約4.2MB・・・。このくらいなら、今時ならそれほど問題にならないサイズだろうか。);ってかんじで、ビットマップなテクスチャを作成しようとしたら、エラー(GL_INVALID_ENUM)になった。最後から2番目の引数"type"にGL_BITMAPを指定できないらしい。GL_COLOR_INDEX."と書いてある。引数"type"にGL_BITMAPとGL_COLOR_INDEXは渡せるけど、"format"がGL_COLOR_INDEXでないとエラーになるぞ、と。ビットマップなテクスチャならメモリサイズも小さくて済むかなー、とか目論んでいたのだが、無理なようだ。ビットマップの文字を描くという方法があるわけだが、この方法だと、描画される文字はビットマップ(文字通りの0か1のみのbitのマップ)ゆえに、アンチエイリアスが掛からない。使ったのだが、たしか、この関数って、アンチエイリアスの掛かったグリフのビットマップなんかもこれで取得できるんだったよなー、というのを思い出したので、その辺りをググって調べつつ、やってみた。おおざっぱな方針としては、まず、アンチエイリアスの掛かったグリフのイメージを取得して、それをDrawPixelsで描画、をディスプレイリスト化。・・・これだと、glBitmapみたいにglColor*でテキストの色を変えることができないけど、まぁ、しかたがないか。必要なバッファのサイズを返してくれるので、そうして取得したサイズぶんだけbyte配列(バッファ)を作成。byte[bufferSize];<その2>さっきのバッファを渡してもう一度GetGlyphOutlineを呼び出せば、バッファにアンチエイリアスの掛かったグリフのイメージが書き込まれる。);gchBuffer.Free();<その3>バッファに書き込まれた値は0~255にはなっていなくて、formatフラグでい指定した階調の値そのままが入ってる。17階調なら0~16の値が入ってるので、255/16とかでスケーリングする必要がある。(注:MSDNには、GGO_GRAY8_BITMAP(65階調)を指定すると0~255の値が入るって書いてあるけど、それは嘘。実際にやってみると、0~64の値が入ってた。)さらに、グリフイメージの左上から、という並びで書き込まれているので、このままでは上下反転した文字になってしまうから、これもまた、ひっくり返しておかないといけない。あと、グリフイメージの幅は「4バイト境界」になってて、metrics.blackBoxXと一致してないので、そこも要注意。(これ、MSDNのリファレンスに書いてなくて、結構悩まされた・・・。)つまり、バッファに入ってるイメージの幅は、metrics.blackBoxXが収まるのに必要十分な4の整数倍、ということ。<その4>さて、グリフイメージが取得できたので、ここからはOpenGLの部分。文字が描かれていない部分はα値を0にして透明にするのが賢明であろうから、フォーマットとして使用できそうなのは、GL_RGBA、GL_LUMINANCE_ALPHA、GL_ALPAの3つだろう。GL_RGBAなら色を指定できるが1pixel辺り32bitのメモリが必要、GL_LUMINANCE_ALPHAだと、1pixelあたり16bitだが色が白のみになる。GL_ALPHAだと1pixelあたり8bitだけど色は黒になる。どれにするかは、用途によりけり、といったところだろうか。普通はRGBAだけど、白か黒の時はLUMINANCE_ALPHAやALPHAにする、とかが、いいのだろうか。後は、glDrawPixelをディスプレイリストにしてしまえばできあがり。毎フレームごとにglDrawPixelを呼び出したりしないこと。高速に描画されるようになる。ちなみに、"glPixelTransfer"関数と"glPixelZoom"関数をglDrawPixelの手前で使えば、<その3>でやる値のスケーリングや上下反転の操作をピクセル転送処理として行うことができる。そのぶん、パフォーマンスが悪くなる。今年は、ファブリックカバーのマキノ・ヘリンボーン。