いまどきはIntelもGMA9XXなら最悪でもARB_fragment_programは使えるらしい。
それ以前のハードで3Dゲームとかあんまり考えたくないし、シェーダ前提は有りだなぁ。頂点シェーダは今でも要求していたわけだし。
CgとかGLSLとか考えるのもめんどいからGLSLで統一もしたい所ではあるけど、GMA950なPCもまだたくさんあると思われる。
GMA950でゲームになるのかというと謎ではあるんだが、いつもそこまでのものを作るわけでも無かろうと考えると完全切捨てはちょっとどうかと。
うわ、いまさら知ったけどアセンブリシェーダもprogram localなパラメータはプログラムオブジェクトに保存されるものだったのか。
てっきりコンテキストごとだと思ってたけど、コンテキストごとなのはenvironment parameterだけだった模様。今までどんだけ無駄な心配してたんだ俺は…orz。
Cgのよほど古いプロファイルとかでなければ、普通にuniformパラメータなんかはプログラムごとに保持されんのね。
そうするとマテリアル情報なんかはシェーダオブジェクトに一回設定して、あとはマテリアルごとにシェーダオブジェクトごと切替えって方がいいのかねぇ。
シェーダの切替えって時間かかるだろうから、シェーダはひとつでなるべくパラメータだけ切替えた方がいいと思ってたんだが。その辺はNVIDIAのドキュメントとか見て確認しなきゃやばいな。
うん、特に何も書いてないな。よくわからん。
でもマテリアルごとにシェーダコンパイルって、コンパイル時間がやばくないですか?
なんかシェーダ周りのコードを見てたら非常に汚くて整理したくなっちゃった。
しかしそんなことよりやることあるだろうということで、数値計算まわりの方の整理を始めた。
メインは行列の列優先化。ちょっくら転置してやればいいだけだろうと思ったが、やはりこのへん書いたのがだいぶ前なこともありいろいろ整理したいわ。
変形はおもに行列で扱ってきたけど、拡大縮小、回転、移動だけを持ってるTransformクラスとかあった方が便利かも。回転だけ取りたいとかあるし。
あとはベクトルも常に4コンポーネントだったけど、3コンポーネントとして扱いたいときが結構あったりする。このベクトルはwがちゃんと0になってたっけーとか思いながら長さ計算して変な値がでたりとかね。
Vector3クラスとか作っても使い分けられない気がするから、length3とか3コンポーネントなメソッドを用意するのが無難かな。
そうすると4コンポーネントなメソッド名をどうするか悩ましいところだが、とりあえずlength4とかにしといた。
Transformクラス以外は一通り書いたつもりだけど、ほぼ初めてテストを書いたらVectorだけで1000行近くいってしまった。
これなんか間違ってる気がするな。テスト書くの難しい…。
なんでずっとベクトルは行列の右から掛けるものと思い込んでたのかわかった。参考にしてた本がそうなってたからだわ。
右からベクトルかけると行優先の方が上手くいくわなー。それと同じで左からかけるときは列優先の方が効率がよい。
どうでもいいが、なぜかcolumn majorの訳を行優先だと思っていて、column major?行優先?行…列…あれ?とか混乱した。どう考えても直訳するだけで列優先になるだろ。