DirectX12の描画処理 #2 [Devlog #003]

Table of Contents

DirectX12を使った描画処理


環境構築の続き

プリコンパイル済みヘッダーの追加

Sourceフォルダ以下にstdafx.hstdafx.cppと追加

dev-dx12-202308(プロジェクト名)
└─ Source
   ├─ Application
   │  ├─ Application.h
   │  └─ Application.cpp
   ├─ Graphics
   ├─ System
   │  └─ Window
   │     ├─ Window.h
   │     └─ Window.cpp
   ├─ stdafx.h
   └─ stdafx.cpp

プロジェクトのプロパティの設定からプリコンパイル済みヘッダー使用(/Yu)に設定(プリコンパイル済みヘッダーファイルはstdafx.h

プロジェクトのプロパティの設定から必ず使用されるインクルードファイルstdafx.hを追加設定

追加したstdafx.cppのプロパティの設定からプリコンパイル済みヘッダー作成(/Yc)に設定(プリコンパイル済みヘッダーファイルはstdafx.h

以下コード

// stdafx.h
#pragma once

// 基本
#pragma comment(lib,"winmm.lib")

#define NOMINMAX
#include <Windows.h>
#include <iostream>
#include <cassert>

#include <wrl/client.h>

// STL
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <array>
#include <vector>
#include <stack>
#include <list>
#include <iterator>
#include <queue>
#include <algorithm>
#include <memory>
#include <random>
#include <fstream>
#include <iostream>
#include <sstream>
#include <functional>
#include <thread>
#include <atomic>
#include <mutex>
#include <future>
#include <fileSystem>
#include <chrono>

#define _USE_MATH_DEFINES
#include <math.h>
// stdafx.cpp
# include "stdafx.h"

GitHubリポジトリ

スマートポインタ"ComPtr"の追加(初期化に使用)

ComPtrとは、MicrosoftのC++言語用のスマートポインタ型で、COM(Component Object Model)オブジェクトの参照カウントを自動的に管理するためのユーティリティ
参考:https://cocoa-programing.hatenablog.com/entry/2018/11/16/000242

COM(Component Object Model)は、オブジェクトのライフタイムを管理するために参照カウント方式を採用しており、参照カウントに応じてメモリの解放を行う

DirectXの大部分はCOMオブジェクトで実装されている

SystemフォルダにUtilityフォルダとSystem.hを追加し、UtilityフォルダにUtility.hUtility.cppを追加

dev-dx12-202308(プロジェクト名)
└─ Source
   ├─ Application
   │  ├─ Application.h
   │  └─ Application.cpp
   ├─ Graphics
   ├─ System
   │  ├─ Utility
   │  │  ├─ Utility.h
   │  │  └─ Utility.cpp
   │  ├─ Window
   │  │  ├─ Window.h
   │  │  └─ Window.cpp
   │  └─ System.h
   ├─ stdafx.h
   └─ stdafx.cpp

stdafx.hSystem.hをインクルード

//stdafx.h

#include "System/System.h"

どこでも使うプログラム(今回はUtility.h)はSystem.hでインクルード

//System.h

#include "Utility/Utility.h"

ComPtrはstdafx.h<wrl/client.h>をインクルードしているので使用可能

ComPtrの実際の使われ方
Microsoft::WRL::ComPtr<ID3D12Device> device;	// deviceはCOMオブジェクト名

Microsoft::WRL::ComPtr<>を省略するためのusing宣言

//Utility.h

using Microsoft::WRL::ComPtr;

Utility.cppは以下のようにする

//Utility.cpp

#include "Utility.h"

デバッグ時にメモリリークを自動検出するため、Visual C++のランタイムライブラリにあるデバッグルーチンと呼ばれるデバッグ専用の関数の中にある_CrtSetDbgFlag関数を利用してメモリリークを検出する
参考:http://marupeke296.sakura.ne.jp/TIPS_No7_SearchMemoryLeak.html

ComPtrの初期化関数CoInitializeEx()と解放関数CoUninitialize()Application.cppで呼び出す
参考:https://learn.microsoft.com/ja-jp/windows/win32/learnwin32/initializing-the-com-library

//Application.cpp

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

   CoInitializeEx(nullptr, COINIT_MULTITHREADED);
   
   Application::Instance().Execute();

   CoUninitialize();

   return 0;
}