//---------------------------------
//宣言部
//---------------------------------
class DxGame
{
//パブリックプロパティ
public:
bool IsError;
//プロテクテッドプロパティ
protected:
Logger* logger; //ログ出力用クラス
CComPtr<ID3D11Device> device; //デバイス
CComPtr<ID3D11DeviceContext> context; //デバイスコンテキスト
D3D_FEATURE_LEVEL featureLevel; //アダプタ(ビデオカード)のDirectX対応バージョン
CComPtr<IDXGISwapChain> swapChain; //スワップチェイン
CComPtr<ID3D11RenderTargetView> renderTargetView; //描画ターゲット
CComPtr<ID3D11DepthStencilView> depthStencilView; //深度ステンシルバッファ
//内部プロパティ
private:
CComPtr<IDXGIAdapter> adpter; //アダプタ(ビデオカード)
CComPtr<IDXGIFactory> factory; //ファクトリオブジェクト
//パブリックメソッド
public:
DxGame(HWND hWnd);
virtual void OnRender();
virtual void OnReSize(WPARAM wParam,LPARAM lParam);
virtual void OnKeyDown(WPARAM wParam, LPARAM lParam);
~DxGame(void);
//内部メソッド
private:
void initDirectXCompornent(HWND hWnd); //DirectXの初期化
};
//---------------------------------
//描画部(デバッグ中に消されて行ったコメント達)
//---------------------------------
void DxGame::OnRender()
{
//float backColor[] = { 0.0f, 0.0f, 1.0f ,1.0f };
//this ->context ->ClearRenderTargetView(this ->renderTargetView,backColor);
//this ->swapChain ->Present(0,0);
}
//---------------------------------
//DirectXの初期化
//---------------------------------
void DxGame::initDirectXCompornent(HWND hWnd)
{
IDXGIDevice1* pDXGIDev = NULL;
ID3D11Device* pDevice = NULL;
D3D_FEATURE_LEVEL featureLevel;
ID3D11DeviceContext* pDeviceContext = NULL;
IDXGIAdapter* pDXGIAdapter = NULL;
IDXGIFactory* pDXGIFactory = NULL;
IDXGISwapChain* pDXGISwpChain = NULL;
HRESULT hr;
RECT Rect;
//--------------------------------------------------------------------
// ウィンドウのクライアント領域取得
//--------------------------------------------------------------------
GetClientRect( hWnd, &Rect );
//--------------------------------------------------------------------
// 初期化順のテーブル
//--------------------------------------------------------------------
D3D_FEATURE_LEVEL FeatureLevels[] = {
D3D_FEATURE_LEVEL_11_0, // DirectX11対応GPU
D3D_FEATURE_LEVEL_10_1, // DirectX10.1対応GPU
D3D_FEATURE_LEVEL_10_0, // DirectX10対応GPU
D3D_FEATURE_LEVEL_9_3, // DirectX9/ShaderModel3対応GPU
D3D_FEATURE_LEVEL_9_2, // DirectX9/ShaderModel2対応GPU
D3D_FEATURE_LEVEL_9_1, // DirectX9/ShaderModel2対応GPU
};
//--------------------------------------------------------------------
// デバイスの生成
//--------------------------------------------------------------------
hr = D3D11CreateDevice(
NULL, // 生成するアダプター
D3D_DRIVER_TYPE_HARDWARE, // ハードウェアデバイス
NULL, // ソフトウェアデバイスのモジュール
0,//D3D11_CREATE_DEVICE_DEBUG, // フラグ
FeatureLevels, // デバイスの初期化順ハードウェアテーブル
sizeof(FeatureLevels) / sizeof(D3D_FEATURE_LEVEL), // ↑のテーブルの数
D3D11_SDK_VERSION, // SDKのバージョン
&pDevice, // デバイス格納先
&featureLevel, // 初期化できたデバイス格納先
&pDeviceContext ); // デバイスコンテキスト格納先
if FAILED( hr )
{
hr = D3D11CreateDevice(
NULL,
D3D_DRIVER_TYPE_REFERENCE,
NULL,
0,//D3D11_CREATE_DEVICE_DEBUG,
FeatureLevels,
sizeof(FeatureLevels) / sizeof(D3D_FEATURE_LEVEL),
D3D11_SDK_VERSION,
&pDevice,
&featureLevel,
&pDeviceContext );
}
if FAILED( hr )
{
//MessageBox( hWnd, "デバイスの生成に失敗しました", "D3D11CreateDevice", MB_ICONSTOP );
goto EXIT;
}
//--------------------------------------------------------------------
// デバイスからIDXGIDevice1を取得して
// そこからアダプターとファクトリーを取得
//--------------------------------------------------------------------
hr = pDevice->QueryInterface( __uuidof(IDXGIDevice1), (void**)&pDXGIDev );
if FAILED( hr )
{
//MessageBox( hWnd, "IDXGIDevice1の取得に失敗しました", "QueryInterface", MB_ICONSTOP );
goto EXIT;
}
// アダプター取得
hr = pDXGIDev->GetAdapter( &pDXGIAdapter );
if FAILED( hr )
{
//MessageBox( hWnd, "IDXGIAdapterの取得に失敗しました", "IDXGIDevice1::GetAdapter", MB_ICONSTOP );
goto EXIT;
}
// ファクトリー取得
hr = pDXGIAdapter->GetParent( __uuidof(IDXGIFactory), (void**)&pDXGIFactory );
if FAILED( hr )
{
//MessageBox( hWnd, "IDXGIFactoryの取得に失敗しました", "IDXGIAdapter::GetParent", MB_ICONSTOP );
goto EXIT;
}
//--------------------------------------------------------------------
// スワップチェイン用のパラメーター
//--------------------------------------------------------------------
DXGI_SWAP_CHAIN_DESC swapChainDesc;
swapChainDesc.BufferDesc.Width = Rect.right - Rect.left; // バックバッファの横
swapChainDesc.BufferDesc.Height = Rect.bottom - Rect.top; // バックバッファの縦
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; // バックバッファのフォーマット
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; // リフレッシュレートの分子
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; // リフレッシュレートの分母
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; // スキャンラインのパラメーター
swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; // スキャンラインのパラメーター
swapChainDesc.SampleDesc.Count = 1; // マルチサンプルのカウント
swapChainDesc.SampleDesc.Quality = 0; // マルチサンプルの品質
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // バックバッファのフラグ
swapChainDesc.BufferCount = 3; // バックバッファ数
swapChainDesc.OutputWindow = hWnd; // 関連付けるウィンドウのハンドル
swapChainDesc.Windowed = 1; // ウィンドウモードで起動するか否か
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // 画面更新の方法
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; // スワップチェインのフラグ
//--------------------------------------------------------------------
// スワップチェインをデバイスから作成する
//--------------------------------------------------------------------
hr = pDXGIFactory->CreateSwapChain( pDevice, &swapChainDesc, &pDXGISwpChain );
if FAILED( hr )
{
//MessageBox( hWnd, "スワップチェインの生成に失敗しました", "CreateSwapChain", MB_ICONSTOP );
goto EXIT;
}
//--------------------------------------------------------------------
// 全初期化処理を突破した
//--------------------------------------------------------------------
EXIT:
SAFE_RELEASE( pDXGIDev );
this ->device.Attach(pDevice);
this ->context.Attach(pDeviceContext);
this ->adpter.Attach(pDXGIAdapter);
this ->factory.Attach(pDXGIFactory);
this ->swapChain.Attach(pDXGISwpChain);
return;
}
DxGame::~DxGame(void)
{
//DirectX解放
BOOL isFullScreen = FALSE;
this ->swapChain ->GetFullscreenState(&isFullScreen,NULL);
if(isFullScreen)
{
this ->swapChain ->SetFullscreenState(!isFullScreen,NULL);
}
this ->context ->ClearState();
this ->logger ->Write(_T("解放処理\n"));
delete this ->logger;
/* スマートポインタ未使用時の解放処理
SAFE_RELEASE(this ->depthStencilView);
SAFE_RELEASE(this ->renderTargetView);
SAFE_RELEASE(this ->swapChain);
SAFE_RELEASE(this ->factory);
SAFE_RELEASE(this ->adpter);
SAFE_RELEASE(this ->device);
SAFE_RELEASE(this ->context);
*/
}