最近Rubyで画像描画するようなのを書いてたんですよ。
MacのCoreImageみたいに1ピクセル単位のプログラムで画像にフィルタかけたり生成しちゃったりするような奴。
目標というか目的としては、MaPZoneみたいな手続的な画像生成をしたい。でもMaPZoneは難しくて使いこなせないのでRubyでかけるといいなと。
で、電車の中でライブラリみたいなのを書いてたんだけど、難しいわけじゃないのでさっくりできちゃった。いやまあ、まだ動かしてないので書くだけ書けちゃったというだけなんだけど。
しかしこれを実行しても全く役に立たないのも分かってるんだよねぇ。
1ピクセル単位で生成したりフィルタをかけて、それをいくつも合成して、っていうのをフルRubyで書いたらすごいことになるよ。いじったらリアルタイムでプレビューしたいんですけど。
どうするか考えたんだけど、やっぱりkernelだけシェーダに変換するのがいいのかなぁ。Rubyがシェーダで動くわけは無いんだけど、Rubyっぽく書けるシェーダならなんとかならんかなぁ。
うーん、たしかに面白そうなんだが、実用的にはべつにGLSLでもいい気がしてきたぞ…。
NVIDIAがついにやっちまった!
Bindless Graphics Tutorial参照。BufferオブジェクトのVRAM上のアドレスを扱う拡張を追加したと。
Bufferオブジェクトとか名前で扱うとドライバで実際のアドレスと対応させなきゃいけないから遅いよね。じゃあ最初っからVRAM上のアドレスで扱えばいいじゃない!
これは普通ですね。GL3以降はGenBuffersとかで作った名前しか使えなくなったしね。
速いらしいよ。
bindable uniformとかめんどいよね。結局VRAM上のバッファにアクセスするだけだし。じゃあポインタでいいや!!
というわけでシェーダでポインタが使えるようになりました。そこにバッファオブジェクトのVRAM上のアドレスを指定してあげると、それはもうポインタのようにアクセスし放題。まあ読み込みだけだけど。
確かにすっきりしてるしいいなぁ。なんで今までなかったのか不思議なくらいだ。
これ標準にならねーかなぁ。
どちらもG80系以降のGPUとRelease 185以降のドライバで使えるようです。185なんてリリースあったっけ。