少し前のページで SharpDX について紹介してきました。
しかし、実際にプログラムを組むとなると、よくわからない所があり手が動かない。
まだ SharpDX プログラムに慣れていないということですね。
そこで入門の次のステップ、基本についてサンプルを示しながら、まとめていこうと思います。
ここでは次のことを示します。
エフェクトの作成方法
入力レイアウトの作成方法
頂点バッファ、インデックスバッファの作成方法
テクスチャリソースの作成方法
エフェクト変数の設定方法
上記設定内容の描画方法
これらの要点が理解できていれば、基本を使って様々な SharpDX プログラムが作れることでしょう。
まず、エフェクトファイルを外部ファイルとして用意します。
例えば次のようなもの
最初なので、SharpDX の導入も復習しながら説明します。
参照に最低限必要なのが次に示す DLL ファイルです。(参照に追加します。)
using namespace ディレクティブはこの辺↓を用意。
あとは次のようにしてエフェクトファイルをコンパイルし、エフェクトを作成する。
ファイルデータが既にメモリ上にある場合についてはこちら↓。
わざわざstringを作り直していますが、どうもUnicode(UTF16)文字列のbyte[]配列はコンパイル対象にならないみたい。
S-JIS か ASCCI, UTF8 などで作った byte[] なら正しくコンパイルしました。
コンパイル後のシェーダファイルからエフェクトを作成する方法はコチラ↓。
最後に、メモリ上にあるコンパイル済みシェーダからエフェクトを作成する方法を示します。
ロードの基本はこれになるのではないでしょうか?
ところで、コンパイル後のシェーダをファイルに保存するには…
なんて、細かいことは次のページを読めば誰でも簡単に解決できます。
エフェクトを作るには057話のページで紹介したように、DLLをリンクとして追加する必要がある。
頂点バッファにどのようなレイアウトで頂点データが格納されているのかを伝える作業です。
例えば先ほど示したエフェクトファイルだと…
これが頂点レイアウトです。
これをデバイスに伝えるには次のコードを書くことになります。
必要になってくる using 名前空間ディレクティブはここで示したとおり。
inputLayout 作成時のセマンティクスとバイトオフセットに注目してください。
さて、常に同じ入力レイアウトを扱うのならばここはマジックコード化してかまいませんが
実際にモデルデータには様々な入力レイアウトが存在するわけで…以下略。
自分は次のようにして自動化することを考えました。
データコンバータ側で頂点バッファを構築する際に、エフェクトファイルも作成しておき
ここで示す inputLayout なる byte 配列を構築することで、読み手は入力レイアウトを気にすることなく…以下略。
とにかくこれで入力レイアウトごとに読み込みコードを書きなおす必要は無くなるわけです。
入力レイアウトを作成する方法を確認しました。
入力レイアウトができているという事は、頂点バッファは作成済みということになります。
(そうでなければ入力レイアウトを決めることはできませんから)
デバイスに頂点バッファを作成する場合に必要になる情報はバッファのbyte配列とサイズだけです。
例を次に示します。
あらかじめ作成しておいた byte 配列とサイズを渡すだけです。
インデックスバッファも同様に BindFlags を IndexBuffer にするだけ。
描画に使うときは、このバッファで描画をおねがいします、と次のようにセットするだけです。
画像イメージファイルからテクスチャを作成する方法は次に示すとおり。
で、メモリ上にテクスチャデータが載っている場合は次のようにします。
簡単な方法を示しただけですので、もっと細かく設定したい場合は次のページでやり方を確認してください。
エフェクトを作成し終えたところで、そこで使用している変数を変更できなければ正しく描画できません。
変数へアクセスする方法には変数名、インデックス、セマンティクスを利用する方法があります。
セマンティクスを利用して、エフェクト変数を設定する方法を次に示します。
このコードが行う内容をイメージするなら、システムからデバイスへ変数情報が渡される情景になります。
どんな情景だよ(笑)
ここまで示してきたデバイスへデータを渡すコードを実行していれば、あとは描画関数を呼ぶだけです。
次のコードは、あるテクニックのインデックス使用レンダリングの例です。
レンダリングテストは次回以降に行いたいと思います。
では、お楽しみに!
2012/07/25 初記。
2012/07/29 更新。