kumaryu日記
2010-07-27
_ [OpenGL] OpenGL4.1と愉快な仲間たち
OpenGL4.1が出てた。まあ出ると思ったけど。
今回の目玉はOpenGLES2との互換機能追加、固定小数点なんかはともかくやっぱりシェーダバイナリの取得だろ。
Direct3Dと違ってOpenGLではシェーダは常にテキストからコンパイルするしか無かった。なんでかというと簡単で、Direct3Dはコンパイラを作ってるのがMSなので吐かれるバイナリは決まってるしドライバはそれを受け取ればいいだけなんだけど、OpenGLはドライバがコンパイラを持ってるので共通なフォーマットといえばソースしか無かったわけだ。
GLESでは組み込みだしさすがにランタイムにコンパイラ持っておくのはしんどいなぁというのと、特定のGPUの特定のドライバで動かすだけなのに毎度コンパイルする必要無いんじゃねというのでコンパイル済みのバイナリを取得できるようになってたんだけど、それがついにPC用のOpenGLにも!
コンパイラが実装依存である以上フォーマットは当然のことながら実装依存なので、あるマシンでコンパイルしたシェーダをあっちのマシンで動かそうってのは出来るとは限らない。フォーマット情報の取得はできるので使えるフォーマットが合ってれば動くんだけどね。
それでも実行する度に毎度コンパイルする必要は無いシェーダをキャッシュしとくには十分使えるんだよね。これは嬉しい機能追加だ。
ビューポート配列ってのも追加された。今まではビューポートはグローバルで1つだったんだけど、ジオメトリシェーダでこのプリミティブはあっちのビューポート描く、こいつはまた別のビューモートに描くっていう振り分けができるようになった。
正直何に使うのかよくわからんが、とりあえず画面分割の2P対戦が一発で描画できるな!それだけかよ!
NVだかEXT拡張であった、シェーダをリンクせずにステージ毎に使える奴も取り込まれたが、これ使いづらいんだよなぁ…。
OpenGL4.1本体はそんなもんだけど、同時に出てた拡張の方が例のごとく興味深い。
ARB_shader_stencil_exportはAMD拡張として既にあった物のARB版だけど、フラグメントシェーダからステンシル値を直接書き出せる。ステンシルテストを有効にしとけばシェーダから書き出した値についてテストもされるようだ。いやそれはdiscardしろよ。
ステンシル値を直接書き出せると、普通に描画するおまけで整数値が描けるんだからお得な感じ。だいぶ遅くなりますとかだとがっかりだけど。変更モードをインクリメントとかにしとくとアキュムレートもできて夢広がりそうですね。
ARB_robustnessだけどこれはいまいち謎。バッファオブジェクトなんかへの安全なアクセスとかデバイスロストが取れたり(?!)とかなんか色々機能があってよくわからんわ。API整理系なんだろうか。安全なプログラムも書けますよーといった感じ?
ARB_debug_outputは便利デバッグ機能。ドライバとかからのデバッグ用文字列メッセージを受け取ったりできるインターフェースの追加。もちろん自分でメッセージ投げるのもできるのでOpenGLを使うライブラリなんかで警告メッセージとかぶん投げるのにも使えます。投げられたメッセージはコールバックで受け取れるんだけど、既定では非同期でコールバックが呼ばれる可能性があるのに注意したい。
こんなもんか。まあ定期アップデートだしそんなすげー機能とかはないね。ドライバはNVIDIAがすぐにでも出す模様。AMDは次のバージョンってことは10.8あたりで対応するんじゃないでしょうか。
しかしOpenGL3以降前提の拡張があたりまえに出てるんですけどAppleはOSXをいつまで放置するんでしょうか。RadeonHD5000系のっけても2.1ではなぁ…。