初めてのDirectXシーン構築


本日の、Form1におけるPaintコールバックはこんな感じだ。Teapotが、オレンジ色の背景の中で、静かにしっかりと回転する。背景のオレンジ色は、64FPSでもって、赤と黄色で交互に背景をクリアしているので、しかもティアリングがないため、オレンジ色に見えるのであるFPSは、FRAPSで計測しても確かに64を維持していた。ティーポット一つだけなら、このパフォーマンスだ。しかし、投影マトリックス、ビューマトリックス、モデルマトリックスの設定がわかり易い感じで書けるものだなーという印象を持った。

private: System::Void Form1_Paint(System::Object^ sender,
      System::Windows::Forms::PaintEventArgs^ e) {

 // ティアリングチェック
 static int tako=0; ++tako;
 if( tako&1 ){
  this->m_device->Clear(ClearFlags::Target, Color::Red, 1.0f, 0);
 }else{
  this->m_device->Clear(ClearFlags::Target, Color::Yellow, 1.0f, 0);
 }
 
 this->m_device->BeginScene();
 {
  this->m_device->Transform->View = Matrix::LookAtLH(   
   Vector3( 0.0f, 3.0f,-5.0f ), // camera position
   Vector3( 0.0f, 0.0f, 0.0f ), // camera target
   Vector3( 0.0f, 1.0f, 0.0f ) // camera upvector
  );
  this->m_device->Transform->Projection = Matrix::PerspectiveFovLH(
   (float)Math.PI / 4, 1.0f, 1.0f, 100.0f // fovy, aspect ratio, nc, fc
  );
  Matrix m;
  m = Matrix::RotationY( tako*.01 );
  this->m_device->Transform->World = m;
 }
 this->m_teapot->DrawSubset(0); 
 this->m_device->EndScene();
 this->m_device->Present();// バッファをスワップ<<
}

ちなみに、m_teapot は、Mesh^ 型であり、Formのコンストラクタで
this->m_teapot = Mesh::Teapot( this->m_device );
のようにして一行でティーポットメッシュを作成している。
しかしこのソースを俯瞰してまず気付くのは、ん?DirectXってOpenGLと同じステートマシンなのか?という点である。BeginScene()とEndScene() の間にあるコードに反応すべきなのである。そう、Worldというプロパティにカレントマトリクスをセットしている点など、何のことはない、m_device にいろいろな描画条件を次々にセットしているだけだ。DirectXはステートマシン方式をどうやら採用してきているようだ。この点において、OpenGL的な考え方で、もしかするとやって行けるところもあるのかも知れないと、ちょっと安心したりもする。