Silverlight 5 (Beta) で Teapot + Blinn-Phong ⑥
- 開発環境の準備と DrawingSurface
- Teapot クラス
- Blinn-Phong シェーダー
- 描画
- トラックボール
- シェーダー パラメータの操作
スライダーで Blinn-Phong の光沢度(Shininess)を変更します。Blinn-Phong シェーダーではピクセルシェーダーで法線と等分角ベクトル(ハーフ ベクトル)の内積をべき乗しますがその指数が光沢度です。この光沢度は Teapot.cs でパブリック変数として持っている Shiness プロパティをピクセルシェーダー レジスターの第4成分(w)として渡しています。
specular.W = this.Shininess;
device.SetPixelShaderConstantFloat4(0, ref specular);
ですから、MainPage.xaml でスライダー コントロールを追加して(<Border />の下の行に挿入)、MainPage.xaml.cs のコールバックでその値を teapot.Shininess に代入してやれば、光沢度が変更できます。依存プロパティとバインディングを使えばコールバックもいらないでしょうが、これも別の話なので、シンプルに代入します。
<Slider Name="slider1" Height="32" Width="205" Margin="0,0,0,0"
Grid.Row="0" Grid.Column="0"
HorizontalAlignment="Center" VerticalAlignment="Bottom"
Minimum="8" Maximum="128" Value="32" ValueChanged="slider1_ValueChanged"/>
private void slider1_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double> e)
{
if (teapot != null)
{
Slider s = sender as Slider;
teapot.Shininess = (float)s.Value;
}
}
以上で、Silverlight 5 (Beta) で Teapot + Blinn-Phong シリーズは終了です。ティーポットは現在では軽すぎるデータであり、Blinn-Phong も軽すぎるシェーダーなので、ベンチマークにもなりませんが、十分サクサク動いています。
基本的な実装方法はこのシリーズで紹介しましたし、テクスチャを張った立方体の例も Walkthrough: Creating and Animating a 3D Textured Cube in Silverlight に紹介されています。自分のデータやシェーダーを持っている人は、ぜひ Silverlight 5 Beta での動作を試してみてください。Mac 上でも GPU を使って表示されるかと思うとゆかいですよね。