1. 開発環境の準備と DrawingSurface
  2. Teapot クラス
  3. Blinn-Phong シェーダー
  4. 描画
  5. トラックボール
  6. シェーダー パラメータの操作

image

スライダーで 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 を使って表示されるかと思うとゆかいですよね。