このページはメモ書きです。説明文書ではないので日本語からしておかしいです。
書いた本人がわからないものを、よくわからないまま書き連ねていますのでご了承ください。
シェーダ…基本的なことから、わからん。
簡単に理解している内容だけ、まとめる。
次に示すようなものがエフェクトファイルである。
頂点シェーダの入出力構造体を作り、グローバルに変数があり
最後にテクニックが書かれている。
これの理解はたやすい。
が、事の発端は次の SkinMesh のサンプルについていきたエフェクトファイル。
最初、これを読んだ時にわからないことがいくつか…
Constant buffers について、うーん。
cbuffer, tbuffer について速度比較をしているものなのだが…
cbuffer は頂点バッファやインデックスバッファに使っていたもの。
tbuffer はテクスチャリソースの方、こちらはランダムアクセスが cbuffer と比べて高速らしい。
同じことができるが、用途ごとに使い分けると高速になるかも…と、なんとなく理解しています。
コレとは別にエフェクト変数にコードからアクセス、設定する方法がなんか二通りあるみたいで…
もう一つが…
後者の設定方法がいまいち、どういう利点があって出てきたのかわからない。
設定方法が楽なのだろうか?
中段の SetConstantBuffer(0, contantBuffer); の、この 0 がエフェクトファイルの変数を
識別しているのだとしたら、自分は設定が楽以前に管理が大変な気がする…
両者について、どちらも GPU へ変数をコピーしているコードである、これはわかるのだが
ちょっと調べてみると UpdateSubresource は、一度テンポラリ領域にコピーして
そこから目的のGPUの領域にコピーするという2段式コピーらしい。ということは、Set 系より低速? よくわかりません。
自分が慣れ親しんでいるのは、セマンティックスや変数名でアクセス指定子を取り出してSetする前者なので
昔から使ってて、管理しやすいし、憶測だけどきっと高速な前者をこれからも使うことにしようと思った。
ところで、テクニックの名前が technique10 だけど、DirectX11 では technique11 なのか?
情報元:http://msdn.microsoft.com/ja-jp/library/ee416106(v=vs.85).aspx
結局どちらでもよくて Direct3D 11 の新規の機能を使いたい場合は technique11 を使う、とのこと。
簡単に調べがつくと見て DirectX 11 のサンプルを眺めていたけど、そこのエフェクトファイルにはテクニックはなく
内部でシェーダ、サンプラなどを設定してテクニックをコードから構築していた…
なんかスッキリしないな。
ひとまず DirectX10 と 11 の間でシェーダの記述が変わったのか?
というもやっとした疑問はちょっとだけ解消したので、メモはここまでとする。
2012/07/22 最終更新