開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 空の CLR プロジェクト
プロジェクト名 teapot

Microsoft DirectX SDK (June 2010)をインストール

参考
日経ソフトウェア 2004/9
Sample Brower でティーポットを描画


エラー

fatal error C1107: アセンブリ 'Microsoft.DirectX.dll' がみつかりませんでした:
/AI または LIBPATH 環境変数を使用してアセンブリ検索パスを指定してください。

対処

プロジェクト構成プロパティ→C/C++→全般→#using 参照の解決
C:\WINDOWS\Microsoft.NET\DirectX for Managed Code\1.0.2902.0
あるいは#usingではなく参照の追加でdllファイルを直接指定する


エラー

'System.IO.FileLoadException' のハンドルされていない例外が teapot.exe で発生しました。
追加情報: 混合モード アセンブリはバージョン 'v1.1.4322' のランタイムに対して作成されており、
追加の構成情報がないと 4.0 ランタイムでは読み込めません。

対処

app.configを用意する
プロジェクト「追加→既存の項目」を選択する
app.configプロパティ
全般→項目の種類:カスタム ビルド ツール
カスタム ビルド ツール→全般
コマンド ライン:copy app.config "$(TargetPath).config"
出力ファイル:$(TargetPath).config



エラー

マネージ デバッグ アシスタント 'LoaderLock' では
'C:\projects\vc++\teapot\Debug\teapot.exe' に問題を検出しました。
追加情報: DLL 'C:\WINDOWS\assembly\GAC\Microsoft.DirectX.Direct3D\1.0.2902.0__
31bf3856ad364e35\Microsoft.DirectX.Direct3D.dll' は、
OS ローダー ロック内でマネージ実行を試行しています。
DllMain またはイメージ初期化関数内でマネージ コードを実行しないでください。
この動作は、アプリケーションをハングさせる原因になる可能性があります。

対処

メニューから「ツール→設定→上級者用の設定」を選択する
メニューから「デバッグ→例外」を選択する
Managed Debugging Assistants→LoaderLockの「スローされるとき」のチェックを外す




teapot.cpp
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
#using <Microsoft.DirectX.dll>
#using <Microsoft.DirectX.Direct3D.dll>
#using <Microsoft.DirectX.Direct3DX.dll>
 
using namespace System;
using namespace System::Windows::Forms;
using namespace Microsoft::DirectX;
using namespace Microsoft::DirectX::Direct3D;
 
//==============================================================================
public ref class Teapot : Form
{
private:
	Device^ device;		// Direct3Dデバイス
	Mesh^ teapot;		// メッシュ・オブジェクト
	PresentParameters^ presentParams;
 
public:
	Teapot(void)
	{
		ClientSize = Drawing::Size(400, 300);
		Text = "Managed Direct3D Sample - Simple Teapot";
	}
 
	bool InitializeGraphics(void)
	{
		try {
			// Direct3Dデバイスの作成に使う構造体を設定
			presentParams = gcnew PresentParameters();
			presentParams->Windowed = true;
			presentParams->SwapEffect = SwapEffect::Discard;
			presentParams->EnableAutoDepthStencil = true;
			presentParams->AutoDepthStencilFormat = DepthFormat::D16;
 
			// Direct3Dデバイスを作成
			device = gcnew Device(0, DeviceType::Hardware, this,
				CreateFlags::SoftwareVertexProcessing,
				presentParams);
			device->DeviceReset += gcnew EventHandler(this,
				&Teapot::OnResetDevice);
			OnResetDevice(device, nullptr);
		}
		catch (DirectXException^) {
			return false;
		}
		return true;
	}
 
	void OnResetDevice(Object^ sender, EventArgs^ e)
	{
		// メッシュ・オブジェクトを作成
		teapot = Mesh::Teapot(device);
 
		// Zバッファを有効にする
		device->RenderState->ZBufferEnable = true;
 
		// マテリアルを設定
		Material^ mtrl = gcnew Material();
		mtrl->Diffuse = Drawing::Color::White;
		mtrl->Ambient = Drawing::Color::White;
		device->Material = *mtrl;
 
		// 照明を設定
		device->Lights[0]->Type = LightType::Directional;
		device->Lights[0]->Direction = Vector3(1.0f, -1.0f, 1.0f);
		device->Lights[0]->Diffuse = Drawing::Color::White;
		device->Lights[0]->Ambient = Drawing::Color::FromArgb(50, 50, 50);
		device->Lights[0]->Enabled = true;
//		device->Lights[0]->Commit();	// 廃止→Enabledで十分
		device->RenderState->Lighting = true;
 
		// ビュー行列を設定
		device->Transform->View = Matrix::LookAtLH(
			Vector3(0.0f, 2.0f, -3.0f),
			Vector3(0.0f, 0.0f, 0.0f),
			Vector3(0.0f, 1.0f, 0.0f));
 
		// 射影行列を設定
		float fAspect = device->PresentationParameters->BackBufferWidth /
			(float)device->PresentationParameters->BackBufferHeight;
		device->Transform->Projection = Matrix::PerspectiveFovLH(
			(float)(Math::PI / 4.0f), fAspect, 1.0f, 100.0f);
	}
 
// private:
	void Render(void)
	{
		if (device == nullptr) return;
 
		device->Clear(ClearFlags::Target | ClearFlags::ZBuffer,
			Drawing::Color::Blue, 1.0f, 0);
		device->BeginScene();
		device->Transform->World = Matrix::RotationY(
			Environment::TickCount / 1000.0f);
		teapot->DrawSubset(0);
		device->EndScene();
		device->Present();
	}
};
 
//==============================================================================
int main()
{
	Teapot^ frm = gcnew Teapot();
	if (!frm->InitializeGraphics()) {
		MessageBox::Show("Direct3Dの初期化に失敗しました");
		return 1;
	}
	frm->Show();
	while (frm->Created)
	{
		frm->Render();
		Application::DoEvents();
	}
	return 0;
}
 

app.config
<?xml version='1.0' encoding='utf-8'?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
 
最終更新:2012年09月17日 09:32