kumaryu日記
2009-08-04 忘れてたー
_ [OpenGL] OpenGL 3.2と仲間たち
SIGGRAPHはじまってたのかー。
で、OpenGL 3.2が出ました。びっくり。3.1出たばっかりじゃん。
内容は
- ジオメトリシェーダが何故か今さら標準化
- Direct3Dからの移植したいぜ拡張が標準化
- マルチサンプルテクスチャの導入
- GPU待ちの標準化
というなんか変なバージョン。
ジオメトリシェーダの標準化も移植の一環なんだろうか。
あとARB_compability拡張が再度取り込まれました。おーい、迷走してんな。
3.1で拡張に追いやられた2.1以前のdeperecated機能がcompatibilityプロファイルとして復活。コンテキスト作るときにプロファイルを指定することで、古い機能を使えるままにするかどうか指定できるようにした模様。
- coreプロファイル
3.0以降の機能だけ使えるコンテキストが作られる。
- compatibility(互換)プロファイル
全部込みコンテキストが作られる。
3.0では同じように前方互換コンテキストと普通のコンテキストがあったのでなんか変だけど、まあこういう形で落ち着いたのかなと。
ついでにNVIDIAとしては互換プロファイルが全部使えるからおすすめ!らしい。
マルチサンプルテクスチャはまあそのままで、今までマルチサンプルなRenderbufferしか作れなかったけどテクスチャも作れるよと。
サンプリングは特定の位置の特定のサンプルをとれる。フィルターは無し。普通のテクスチャみたいに使いたいならやっぱりBlitで一旦マルチサンプルの解決してから使ってください。
何に使うんだかよくわからなかったけど、良く考えたらこれである程度カスタムのMSAA作れんのね。位置は固定なんだけど。そういやNV拡張で似たようなのがあったな。
これだけだと微妙なんだけど、おまけにARB_sample_shading拡張が同時に公開されてる。標準ではないけど。
これはマルチサンプル有効時に、各サンプルごとにフラグメントシェーダを走らせる事が出来る。まあつまり、各サンプルごとにべつな値を書き出せるっつーことで、マルチサンプルテクスチャと組み合わせると一回でこれまた結構素敵な数の値を書き出したり出来ちゃうわけね。
えーと、なんかすごい機能なんだけど、ぱっと使い道が思い付かないね。カバレッジマスクも出力できるから、きっと楽しいことが出来そう。
一発で多数の出力ならジオメトリシェーダとテクスチャ配列で似たような事は出来んだけどな。というかそのためにジオメトリシェーダ標準化したんじゃねーのかよ。まあでもいちいちラスタライズしなくて済むよね。
あとGPU待ちは、今までglFinishとかいうとにかく全部終わるまで待つコマンドはあったんだけどそれだけじゃなんだべというので追加された奴。
syncオブジェクトとやらを設定しておくと、そこまで実行されるまでタイムアウトとかも指定して待つ事が出来る。
Timerオブジェクトみたいなクエリーオブジェクトかと思ったら違ったわ。新しい同期オブジェクトの導入。他に何か同期オブジェクトを追加するあてがあるんだろうか。
細かい機能としてはキューブマップをシームレスにサンプリングする機能が入ってた。テクスチャ座標のZ成分はどの面をサンプリングするかにしか使ってなかったから、XY成分が0.0から1.0を突破してた場合は酷いことになっちゃってうんたらかんたらという感じっぽい。
あとはglDrawElementsで描画する際のインデックス群に一律のオフセットを設定できるような関数追加とか。
今までは頂点インデックス配列の何番目から描き始めるかは指定できたけど、頂点インデックス配列の中身そのものにはオフセット指定できなくて微妙に悔しい思いをしたのを解決です。もっと早く入っていい機能だった。
とりあえずはこんなもんだった。GLSL1.5はなんか入力とかに構造体を指定できるとかできないとか書いてあった気がするけど知らん。基本的にはD3Dから移植してくるのに便利という機能が追加されたくらい。
しかし3.2自体より同時に公開された拡張の方が新しくていいですね。そんなに派手な機能はないけど。
MRTでの出力先ごとにブレンド関数を個別に設定できるよう拡張が追加されてたりした(ARB_draw_buffers_blend)。前から設定できてたのはブレンドの有効無効だけだっけか。
ARB_texture_gatherは4テクセル同時フェッチ命令の追加。AMD_texture_texture4ってのもあったけどそれの強化版だね。
NVIDIAが早速ドライバを公開してるけど、ジオメトリシェーダがまだ拡張扱いな以外は標準のほぼ全部実装されてるってことですかね。しかもGeForce8系以降全部で。
なんつーか、これNVIDIAのドライバに併せてOpenGL標準作ってねーか?いやべつにいいけどさ。
で、NVIDIAのドライバではさらに追加の拡張も出てる。それほど面白いのは無いけど、微妙によさげなのがNV_copy_image。
Renderbufferとテクスチャ間の部分コピーが一発で出来る。向きはどっちでもいけるっぽい。もちろんテクスチャ間、Renderbuffer間もいけるだろう。
ついでに別コンテキストのRenderbufferとかテクスチャもコピーできる。これが俺に必要になることはなさそうだが…。つか共有もしてない全く別のコンテキストからイメージコピーしたいってどんな状況だよ。
いままで何気にテクスチャ間のコピーとかできなかったもんなぁ。やらないけどさぁ。
いままで何気にRenderbufferへのコピーとかできなかったもんなぁ。だっていらないしさぁ。でもOpenCLで必要だって事ですよね。
あとはEXT_separate_shader_objectsもあるけどこれは使えないなぁ。
GLSLだと、頂点シェーダ、フラグメントシェーダ、あればジオメトリシェーダをリンクしたプログラムオブジェクトを作って、プログラムオブジェクト単位で一括設定しかできないけど、それをシェーダドメインごとにべつなプログラムオブジェクトを設定できるようにしたと。
アセンブリシェーダなんかではこれが普通だし結構いいんだけど、ただ制限が厳しすぎる。
各ドメインでリンクしてるわけじゃないので、varying変数のリンクが出来ずに使用不可に。gl_TexCoordとかの組込み変数でやりとりしろってさ。
あとuniform変数はプログラムオブジェクト単位で保持されるので、同じ名前の変数でも各ドメインごとに設定しないといけない。
これらの制限は結構厳しいよなぁ。
NV_parameter_buffer_object2ってのもあるけどこれはNVのアセンブリシェーダ拡張向けなので普通の人には関係ないわ。
なんか3.0から半年ごとにぽんぽんと3.1、3.2を出してきたけど、このペースだと3.3は来年春に出ちゃうのかな?
3.3とか今後はどうなるんだろう。どうなるもこうなるもしばらくはNVIDIAが暴れまくるだけなんだろうけど。そろそろDirect3D 11対応のGPUがどうこうという話になるだろうから、その辺の機能が入ってくるのかな。
Profileてな概念を出してきたので、ずっと昔言ってたImmediateプロファイルとか追加してくる可能性はあるんだろうか。もっと低レベルなバージョン。うん、無いな。
テッセレータは入れるのかなぁ。でもDirect3D移植性でTransGamingが暴れてるので入る可能性はあるなぁ。固定機能とかシェーダステージの追加とか勘弁して欲しいよ。
Snow Leopardが出たらOpenCLの実装が出るわけで、それでちょっと変わる可能性があるのかも。OpenGL3系も現状Macで使えないし*1、はよSnow Leopard出てくれー。
*1 コンテキスト作る方法がない