kumaryu日記
2006-10-21 やっちまった
_ [Riko] エラー処理とか
なんとか拡張の有無判定とエラー処理は作った。
エラー処理は簡単で、適当な所でチェックしてまずけりゃ例外投げるだけ。
もともとOpenGLがエラーの個数が少ないんで簡単だった。
拡張はちょっと手間取った。
拡張チェックした時に、必要な拡張を記録しておいて…というのを考えてたんだが、記録しておくのが結構面倒だ。
重複無しで記録しておこうと思うとかなり大変。追加する時に文字列比較じゃ重そうじゃね?とか考えるとねぇ。
まあそれはともかく、もう一個困ったのが拡張判定でとある拡張が無ければ例外、というわけにもいかなかった。
例えばARB_shadowとかさ。ARB_shadowが無くてもOpenGL1.4以上なら動かなきゃならんわけで、とすると1.4以上orARB_shadowになる。
そりゃ、1.4以上でARB_shadowが無い環境ってどんなんよ?って言われりゃ、そんな環境思い付かんのだが。
しかし一部のRadeonではOpenGL2.0を返すわりにARB_texture_non_power_of_twoが無いとかありうる、というか現にあったんだよな*1。
うーん、でもそんなの特殊ケースだし実質使えないことにしても良い気がしてきた…。基本的に拡張名で判断すりゃいいのか?
う、でもNV_texture_rectangleとEXT_texture_rectangleとARB_texture_rectangleなんかはどれで判断したらいいのかわからん。つか無理か。
まあ結局は速度は気にしないことにして、Ruby側でフックかけるとそこに有無判定した拡張名を渡すことにした。
あとはRuby側で煮るなり焼くなりすきにしろと。 まあ重いが気にするな。ほんと微々たるもんだって。
あとDepthOffsetも実装。デカール貼ったりするのに使うよね。
OcclusionQueryとTimerQueryを実装しようかどうか悩む。TimerQueryはともかく、OcclusionQueryの使いどころがいまいちわからんのだよな。
上手いインターフェースか必要性が思いついたら実装するか。
ドキュメントは書こうと思ったが全部付けていくのは大変なんで、使ったクラスから順に書くことにした。クラスを初めて使う時にはドキュメントをかくのだ!
*1 ちなみにその環境では非2の累乗サイズの2Dテクスチャは作れるんだが遅いらしい。自分で確認はしてないけど。
_ [Riko] コンテキスト
あとコンテキストの扱いをどうしよう…。
コンテキストは明示的なオブジェクトとして扱ってなかったんだけど、やっぱり必要な気がする。
というか、Rikoの読み込み時点ではOpenGLのコンテキストって作られてなくて、SDLのウィンドウとかが作られて初めてRikoが使えるようになるんだよね。
でもそれが分かりづらい。
描画とかはともかく、コンテキスト出来る前にテクスチャ作ろうとしたり、拡張何使えんのかなとか調べようとしたりは普通にやりそうだ。
でも現状だとコンテキストが無い状態でそんなことやると何が起きるかわからん。良ければ何も起きないかエラー、最悪落ちる。
まあ落ちるのはいいけど、それでもなんで落ちてるんだかくらいは分からんとね。だからコンテキストを明示的にオブジェクトとして扱って、こいつを初期化しねーと動かねーぜ、という状態にしようかと思った。
う、うーん。でもやっぱりウィンドウを作る前にテクスチャが作れないのには変わりないなぁ…。
GLee使うとGLeeInitって必要な時に勝手に呼ばれるようになってるから明示的に呼ぶ必要もあんま無いんだよなぁ。そもそもコンテキストに関してはRikoでは知らんことにする手もありだな。