本日の、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的な考え方で、もしかするとやって行けるところもあるのかも知れないと、ちょっと安心したりもする。