頂点シェーダの機能
1.頂点シェーダとは何をするものか?
- レンダリング対象の各頂点に対し、座標・色・テクスチャ UV などを変更したりする。
- 処理の相手は頂点なので、頂点シェーダは頂点の数だけ実行される。
- プログラマーは、基本的には座標・色・テクスチャ UV のセットを行うが、それ以外にも「光源から見て各頂点がどこの位置にあるか」など、ピクセルシェーダに渡すための独自のパラメータを計算・セットしておける。
- プログラマーが自分で処理を書ける半面、固定機能パイプラインなら自動で行ってくれるポリゴン頂点計算も、プログラマーが行わなくてはいけない。
( SetTexture などでソースコード上からセットしたテクスチャなどはちゃんと描画される)
2.頂点シェーダの使用例
※以下の例では、頂点シェーダのほか、ピクセルシェーダの処理も必要となる。ピクセルシェーダについては将来解説する。
影付けの一種。頂点シェーダは、光源から見た各頂点へのベクトルなどを独自セットするのに使われる。
頂点シェーダは、頂点の法線情報をセットするのに使われる。このほかに、凹凸を描いたテクスチャも必要。
- HLSL によるスキニング(ボーンによるメッシュ形状の変形のこと)
あらかじめ、ボーンを曲げるための行列データをソースコード上にてセットしておき、その行列を頂点シェーダで計算して保持する。
3.最も簡単な頂点シェーダはどんなコードか?
以下のようなもの。
※Takashi Imagire T-Pot 本より、シェイプアップして引用
float4 VS() : POSITION // 引数なし、座標を float4 で返す
{
return float4( 0, 0, 0, 1 ); // 適当な座標
}
technique Tshader // シェーダの管理単位「テクニック」
{
pass P0 // テクニックの管理単位「パス」
{
// シェーダ
VertexShader = compile vs_1_1 VS(); // シェーダのバージョンを指定
}
}
8行目の、pass P0 のスコープ内で、ピクセルシェーダの指定も行うが、今回は省略。
実際、ピクセルシェーダを指定しなくてもプログラムは動くが、その場合の動作は不定。(固定機能パイプラインが使用される?)
原則的に頂点シェーダもピクセルシェーダも指定すべきである。
4.頂点シェーダの引数と戻り値
| セマンティクス |
意味 |
| POSITION |
ローカル空間の頂点の位置座標 |
| BLENDWEIGHT |
ブレンディングの重み |
| BLENDINDICES |
ブレンドのインデックス |
| NORMAL |
法線ベクトル |
| PSIZE |
ポイントサイズ |
| DIFFUSE |
ディフューズ色 |
| SPECULAR |
スペキュラ色 |
| TEXCOORD0~ |
テクスチャ座標 |
| TANGENT |
接線 |
| BINORMAL |
従法線 |
| TESSFACTOR |
テセレーション係数 |
さらに、引数にも戻り値にも、これら単体だけでなく、いくつかを持たせた構造体を使うことが可能。
構造体の記述の仕方は以下のとおり。
struct VS_OUTPUT
{
float4 Pos : POSITION; // 頂点座標
float2 TexA : TEXCOORD0; // テクスチャ UV その1
float2 TexB : TEXCOORD1; // テクスチャ UV その2
float2 TexC : TEXCOORD2; // テクスチャ UV その3
float4 Diffuse : DIFFUSE; // ディフューズ色
};
5.シェーダプログラムのデバッグ方法
DirectX SDK に付属の「 PIX for Windows 」(英語)を使うことで、HLSL コードのデバッグができる。
残念ながら自作のシェーダサンプルは PIX for Windows を通して動かなかった。
この PIX for Windows は、WPF 用のパフォーマンス監視アプリと同じく、ビルドが完了した実行形式のファイルに対して使用するためのもので、VisualStudio のコンパイラのようなソースチェックはしてくれない。(と思われる。)
なお、PIX for Windows は日本語を含んだパスにあるファイルを扱えないようだ。
そのような EXE を PIX から実行させようとすると、エラーが発生し、実行に失敗する。
6.参考画像
デプスシャドウ、バンプマッピング、HLSL によるスキニングを行っているサンプルをキャプチャした画像。
このサンプルでは、頂点シェーダとピクセルシェーダ処理の両方を行っている。
最終更新:2016年10月16日 21:06