シェーダ管理を行ったときのメモ
ようやっとプロジェクトが一段落してきたので、ここまでに得た事を機密情報を避けながらメモをまとめておく.
今回のプロジェクトは、はじめてプログラマブルシェーダの実運用を行った.
サンプル書いてみたりして遊んでいたけれども、やはり実践編は得るモノが多いなと感じた.
メモとして書き出してみると、(改めて)当たり前の事が多いことに気がつくのだけれども…
ま、とてもよい勉強になりました.
そんなわけで以下メモの展開
わかったこと
なんとなくわかったこと
- 頂点フォーマットのサイズは処理速度に影響する
- varying 変数の数が増えると処理速度的に損
- 処理速度が、フラグメントシェーダのネックになっているか、頂点シェーダのネックになっているのか把握が難しい
→ まず、必要なのは描画のパイプラインの理解は必須知識
→ 例?:(VS(...→ 視野座標変換 → 射影変換 →...) → 画面クリップ → DepthTest → FS(...→ AlphaTest))
- Uniform の設定(glUniform*)は意外に遅いらしい
- varying変数/uniform変数/attribute変数は、命名規則を明確に決めてしまった方が良い.
ライティング
- フラグメントライティングの見栄えは非常によい
- (ライトや視線の)ベクトルは、オブジェクトのローカル座標に変換して利用した方が得
- バンプマップは(処理速度的に)遅い手法ではない
バンプマップ
UVアニメーション
- Image の座標系がどのようになっているのか把握することは重要
- オーサリングツール上でイメージが左上(0,0)の場合、OpenGLでは左下(0,0)なのでUVの入れ替えが必要
- いわば、右手系と左手系の様な関係にある
- UV座標を単純出力する場合には、Y軸(V)を反転する(1.0 - V)と変換済みのUV座標が手に入る
- しかし、アニメーションのデータを出力する際には注意が必要.
- scaleが掛かったときには、translateにも考慮する必要がある
- UVアニメーションの適用時には、TextureのRepeatmode への考慮が必要になる.
例: Imageの座標系をあわせるためにVの反転を行う場合、(V * -1)としてしまうと、Repeat以外では異なる表示になる
擬似コードとして次のような対応を行った
scaling_trans = 1.0f - scale; trans = trans + scaling_trans transformation( trans, rotation, scale )
なんとなく考えたこと
- cgfx(Cg)やtechnique(HLSL)のpassは結局使い物にならないのでは?
- フラグメント処理がネックになる場合、早期Zテストは有効な手法かもしれない
- スペキュラだけ別バッファにレンダリングして後で合成すれば良い?
- model単体での描画は不便だ