開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
空の CLR プロジェクト |
プロジェクト名 |
teapot |
Microsoft DirectX SDK (June 2010)をインストール
エラー
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