OpenGLでUI

開発中のGUIは独自でやっていることは前回の日記に書きましたが、このUIの使っているクラスは独自2Dエンジン以外にもOpenGLで描画する版があります(というか、もともとそのために作った)。
せっかくなので、OpenGL版でも動かしてみることに。だた、これまでお絵描きの結果はパフォーマンスの関係上バックバッファに直接転送していました。こういったことはGLではワンクッションおかなきゃいけないのでちょっと工夫を。

ビットマップ画像の表示

独自エンジンとは描画側に工夫が必要になってしまいますが、テクスチャに更新画像を転送してそれをレンダリングする方針をとることにしました。
テクスチャへの書き込みは、
glTexSubImage2D
を使って転送。
ただ、この関数では転送元が連続したメモリ領域に画像がある必要があり、矩形転送のようなことはできないっぽい。
ということで、一列ごとに転送していくことに。連続領域にいったん転送してから一度にglTexSubImage2Dを使って転送するのとどちらが速いか比べたところ、一行ずつglTexSubImage2Dを使って書いていったほうが速かったです。

GL版では、キャンバスの拡大や縮小は極力GPUの力を使ってやってしまおうとおもいます。
とはいえ、テクスチャへ転送するオーバーヘッドが大きいのか、独自エンジン版のほうが速いみたいです。

後々、3Dと組み合わせることも考えているため、まぁ、仕方ないかぁ

垂直同期

GL版にしてみると、レスポンスが悪い。
いろいろと試してみたところ、どうもダブルバッファリングをやるともたつきが発生しているようす。
かといって、ダブルバッファリングを行わないとちらつきがひどいため、オフにできないし。

このご時世、ダブルバッファリングごときの処理が重いということも考えづらいため、垂直同期あたりを疑ってみることに。
WGLのwglSwapIntervalEXTでオフにできるらしいので、切ってみると見事にもたつきが解消されました。
(参考)

これで、先のテクスチャへの転送オーバーヘッドを除いてGL版でも問題なく動作するようになりました。
日記の冒頭に挙げた画像はGL版インタフェースの画面です。まぁ、違いがないためわかりませんが。


たのしいたのしい、お絵かきソフト作成。