kumaryu日記
2007-03-01 寝てた
_ 昨日
寝てました。
_ [OpenGL] SDKktkr
そんなわけでOpenGLですが、まあこんなとこ見てる人は知ってるかもしれませんが、OpenGL SDKが出てました。
OpenGL SDKはツールとかGLeeとかの便利なライブラリへのリンクがまとまってるだけで特に新しいライブラリがあったりするわけじゃないんだけど、OpenGL2.1対応のリファレンスがあるのがとてもありがたい!
今まで青本を買うしか無かったのがオンラインでタダで見れるようになりましたよ!
出来れば一括ダウンロードできる状態にして欲しかったが、まあ、あんまり贅沢言えないか。あと拡張のリファレンスもあれば最高だが…まあ…うん、まあ。
いやせめて拡張の仕様書をHTMLにしてくれるだけでも…まあ、うん…まあ。
とりあえずこの進歩は偉大ですね。
そんなことよりLong SpeakとMt.Evansですよ。
LongSpeakは夏頃*1出る予定の新OpenGL。
Mt.Evansは秋頃出る予定のDirectX10相当のOpenGLバージョンらしい。
まあThe OpenGL Pipeline Newsletter Volume 003見りゃ全部書いてあるわけだが。
Mt.Evansは思ったより新しいことはなくてLongSpeakの新しいオブジェクトモデルにほんとにDirectX10の機能、つーかGeForce8800の拡張相当の機能が標準になるだけっぽいね。
Newsletter2ではMt.EvansではDirectX10みたいに古い機能*2を切り捨てるとか書いてあった気がするんだけど、どうなんだろ?
でLongSpeakの新しいモデルでは、テラカオスな今のモデルを一新?して、基本的にオブジェクトは不変。作ったらパラメータの変更は出来ず、必要なパラメータは作る時に指定しておけ、ということになるらしい。
他にでかい変更は
- オブジェクトの非同期作成
ドライバは作成時にハンドルを返すだけ返して必要な時まで作成を遅らせられるということらしい。今までとあんまり変わらんような?
- 複数のシェーダをバインド出来る
やったー、と思ったらそんなに甘くなくて、GLSLではVertexShaderとFragmentShaderをリンクしてからしかバインドできなかったが、それを単体でバインドできるというCgっぽいことが出来るようになっただけらしい。
あー、そう。結構どうでもいい。
- テクスチャとバッファオブジェクトの境界があいまいに
バッファをバインドできるところにテクスチャがバインドできたりその逆だったりということらしい。
テクスチャはバッファオブジェクトの特殊化されたものになるのか。 使いやすいかどうかはともかく柔軟にはなるね。
- シェーダの共通uniform変数グループが出来る
まあつまりuniform変数を一括設定してみんなで使い回しだ。
G80で言うところのbindable uniformだ。 標準だぜやほー。
これほんと助かるよ。
あ、あとLongsPeakとそれ以前ではOpenGLのコンテキストが別になるみたい。
両方作ったりなんとかして相互運用はできるものの、基本的には別物ってことで、SDLとかwxWidgetsとかFOXとかのOpenGLコンテキスト使ってる場合はなんとかせにゃならんね。
対応してくれればいいだけだし、従来のコンテキストが出来てれば自前で作っても大した面倒も無さそうけど。
そういやLean and Meanの話が出てないけどどうなんだろ。無ければ無いでもいいんだが、出来てくれるとちょっと嬉しいというか。
新しいオブジェクトモデルの方に戻ってみると、OepnGLの拡張性*3を保ちながら、オブジェクト作成時に全てを決めておくというのを実現するのにテンプレートてな概念が追加されてるっぽい。
Newsletterからパクってきたサンプル↓ではテクスチャを作ってるのかな。
// Create an image template GLtemplate template = glCreateTemplate(GL_IMAGE_OBJECT); assert(template != GL_NULL_OBJECT); // Define image attributes for a 256x256 2D texture image // with specified internal format glTemplateAttribt_o(template, GL_FORMAT, format); glTemplateAttribt_i(template, GL_WIDTH, 256); glTemplateAttribt_i(template, GL_HEIGHT, 256); glTemplateAttribt_i(template, GL_TEXTURE, GL_TRUE); // Create the texture image object GLbuffer image = glCreateImage(template); // Define the contents of the texture image glImageData2D(image, 0, // mipmap level 0 0, 0, // copy at offset (0,0) within the image 256, 256, // copy width and height 256 texels GL_RGBA, GL_UNSIGNED_BYTE, // format & type of <data> data); // and the actual texels to use
テンプレートつかファクトリ?オブジェクトを作って、名前指定でパラメータ設定してやって作成用の関数に渡すとな…。
おー、これはかわいいな。BeOSのBMessageにパラメータぶち込んでInstantiate静的メンバ関数でインスタンス化を思い出しましたよ*4。
オブジェクト指向っぽくていいですね。
あとはNewsletter3ではGLSL1.2のcentroid指定とか、VistaではOpenGL大変な話とか。
centroid指定はまだよく読んでない。でも仕様を読んでもよくわかんなかったので参考になると思う。
Vistaで大変な話は、とりあえずGDIといっしょに描画してると死ねるというのと、FrontBufferに直で書いてFlushもFinishもしてない*5と真っ黒、てな話。
あとAero有効にしたまま行儀良くOpenGLで描画するには、ってのも。これは把握しておいた方が良さげ。せっかくのVistaだし、アプリ起動した瞬間Aero強制Offとかダサいもんね。
来週あたりのGDCではFX Composer2ベータが出るってはなしだし、また面白い話が出るのかなぁ。
_ [XNA] Wiiリモコン
XNAでWiiリモコンとかありえないだろ、常識的に考えて…。
だってXBox360標準でBluetooth対応してねーし。USBでなにかぶっ挿したとしてもXNAから使えねーし。
たぶん変な外部デバイスでWiiリモコンのデータ取得させてコントローラ改造して無理矢理流し込むとかかな?
俺の予想ではMindStormで作ったロボットをWiiリモコンで操作してXBox360のコントローラを操作させる、だね。これはカコイイ。