図1101a
*Dx12デバイス *コマンドキュー *スワップチェーン *デスクプリタヒープ *レンダーターゲットビュー *コマンドアロケーター *ルートシグネチャー *コマンドリスト *パイプラインステート *シェーダ(最低限、頂点とピクセル) *メッシュ *テクスチャ(必要に応じて)とシェーダリソースビュー *サンプラー(必要に応じて)
図1101b
シンプルとはいえ、結構な量のファイル構成になっています。
int MainLoop(HINSTANCE hInstance, HWND hWnd, int nCmdShow, int iClientWidth, int iClientHeight) {
//終了コード
int retCode = 0;
//ウインドウ情報。メッセージボックス表示チェックに使用
WINDOWINFO winInfo;
ZeroMemory(&winInfo, sizeof(winInfo));
//例外処理開始
try {
//COMの初期化
//サウンドなどで使用する
if (FAILED(::CoInitialize(nullptr))) {
// 初期化失敗
throw exception("Com初期化に失敗しました。");
}
basedx12::Scene scene;
basedx12::App::Init(hWnd, &scene, hInstance, nCmdShow, iClientWidth, iClientHeight);
//メッセージループ
MSG msg = { 0 };
while (WM_QUIT != msg.message) {
//キー状態が何もなければウインドウメッセージを得る
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//更新描画処理
basedx12::App::UpdateDraw();
}
//msg.wParamには終了コードが入っている
basedx12::App::Destroy();
retCode = (int)msg.wParam;
}
catch (exception & e) {
//STLエラー
//マルチバイトバージョンのメッセージボックスを呼ぶ
if (GetWindowInfo(hWnd, &winInfo)) {
MessageBoxA(hWnd, e.what(), "エラー", MB_OK);
}
else {
MessageBoxA(nullptr, e.what(), "エラー", MB_OK);
}
retCode = 1;
}
catch (...) {
//原因不明失敗した
if (GetWindowInfo(hWnd, &winInfo)) {
MessageBox(hWnd, L"原因不明のエラーです", L"エラー", MB_OK);
}
else {
MessageBox(nullptr, L"原因不明のエラーです", L"エラー", MB_OK);
}
retCode = 1;
}
//例外処理終了
//COMのリリース
::CoUninitialize();
return retCode;
}
basedx12::Scene scene;
basedx12::App::Init(hWnd, &scene, hInstance, nCmdShow, iClientWidth, iClientHeight);
class Scene :public SceneBase {
ComPtr<ID3D12PipelineState> m_pipelineState;
shared_ptr<BaseMesh> m_baseMesh;
public:
Scene() :SceneBase() {}
virtual ~Scene() {}
virtual void OnInit()override;
virtual void OnInitAssets()override;
virtual void OnUpdate()override;
virtual void OnDraw()override;
virtual void OnDestroy()override;
};
virtual void OnInit()override;
void Scene::OnInit() {
ResetActiveBaseDevice<GameDevice>(2);
}