環境はWindows10Pro(64bit)、VisualStudio2015Communityです。
挙動に関して数点下記のような奇妙な点があり、どこに問題があるのか特定できず対処に困っております。
・Windows7(32bit)では発生しません。
・Windows10上であればVisualStudio2010、2013でも発生します。
・Windows10SDK組み込みと2010JuneのいずれのDirectXSDKを使用する設定としても発生します。
・書籍サンプルやWeb上のチュートリアルでも発生します。
・描画時SwapChainのPresentメソッドを実行しないようにすると発生しなくなります。
下記取り急ぎ、サンプルコードを書いてみました。
#include <windows.h>
#include <d3d11.h>
#pragma comment( lib, "d3d11.lib" )
#define WINDOW_WIDTH 200
#define WINDOW_HEIGHT 200
ID3D11Device* g_pDevice;
ID3D11DeviceContext* g_pDeviceContext;
IDXGISwapChain* g_pSwapChain;
ID3D11RenderTargetView* g_pRenderTargetView;
ID3D11DepthStencilView* g_pDepthStencilView;
ID3D11Texture2D* g_pDepthStencil;
#if defined(DEBUG) || defined(_DEBUG)
// デバッグコンパイルの場合、デバッグレイヤーを有効にする。
// ソフトウェア レイヤー
UINT createDeviceFlag = D3D11_CREATE_DEVICE_DEBUG;
#else
UINT createDeviceFlag = 0;
#endif
#define SAFE_RELEASE(x) if(x){x->Release(); x=NULL;}
void initD3D11(HWND hwnd){
// デバイス・スワップチェイン作成
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 1;
sd.BufferDesc.Width = WINDOW_WIDTH;
sd.BufferDesc.Height = WINDOW_HEIGHT;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hwnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
D3D_FEATURE_LEVEL pFeatureLevels = D3D_FEATURE_LEVEL_11_0;
D3D_FEATURE_LEVEL* pFeatureLevel = NULL;
D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL,
createDeviceFlag, &pFeatureLevels, 1, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pDevice,
pFeatureLevel, &g_pDeviceContext);
//レンダーターゲットビューの作成
ID3D11Texture2D *pBackBuffer;
g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
g_pDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_pRenderTargetView);
SAFE_RELEASE(pBackBuffer);
//深度ステンシルビューの作成
D3D11_TEXTURE2D_DESC descDepth;
descDepth.Width = WINDOW_WIDTH;
descDepth.Height = WINDOW_HEIGHT;
descDepth.MipLevels = 1;
descDepth.ArraySize = 1;
descDepth.Format = DXGI_FORMAT_D32_FLOAT;
descDepth.SampleDesc.Count = 1;
descDepth.SampleDesc.Quality = 0;
descDepth.Usage = D3D11_USAGE_DEFAULT;
descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
descDepth.CPUAccessFlags = 0;
descDepth.MiscFlags = 0;
g_pDevice->CreateTexture2D(&descDepth, NULL, &g_pDepthStencil);
g_pDevice->CreateDepthStencilView(g_pDepthStencil, NULL, &g_pDepthStencilView);
//レンダーターゲットビューと深度ステンシルビューをパイプラインにバインド
g_pDeviceContext->OMSetRenderTargets(1, &g_pRenderTargetView, g_pDepthStencilView);
//ビューポートの設定
D3D11_VIEWPORT vp;
vp.Width = WINDOW_WIDTH;
vp.Height = WINDOW_HEIGHT;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pDeviceContext->RSSetViewports(1, &vp);
//ラスタライズ設定
D3D11_RASTERIZER_DESC rdc;
ZeroMemory(&rdc, sizeof(rdc));
rdc.CullMode = D3D11_CULL_NONE;
rdc.FillMode = D3D11_FILL_SOLID;
ID3D11RasterizerState* pIr = NULL;
g_pDevice->CreateRasterizerState(&rdc, &pIr);
g_pDeviceContext->RSSetState(pIr);
//アソシエーション
HRESULT hr;
IDXGIFactory* pfac = nullptr;
hr = g_pSwapChain->GetParent(__uuidof(IDXGIFactory), (void**)&pfac);
// Alt+Enterでの最大化を無効にする設定をする。
pfac->MakeWindowAssociation(hwnd, DXGI_MWA_NO_WINDOW_CHANGES | DXGI_MWA_NO_ALT_ENTER);
SAFE_RELEASE(pIr);
}
void render() {
//画面クリア(実際は単色で画面を塗りつぶす処理)
float ClearColor[4] = { 0,0,1,1 };// クリア色作成 RGBAの順
g_pDeviceContext->ClearRenderTargetView(g_pRenderTargetView, ClearColor);//画面クリア
g_pDeviceContext->ClearDepthStencilView(g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);//深度バッファクリア
g_pSwapChain->Present(0, 0);//画面更新(バックバッファをフロントバッファに
}
void cleanup() {
SAFE_RELEASE(g_pDepthStencil);
SAFE_RELEASE(g_pDepthStencilView);
SAFE_RELEASE(g_pRenderTargetView);
SAFE_RELEASE(g_pDeviceContext);
SAFE_RELEASE(g_pSwapChain);
SAFE_RELEASE(g_pDevice);
}
LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_KEYUP:
switch (wParam) {
case VK_ESCAPE:
PostQuitMessage(0);
//DestroyWindow(hWnd);
}
break;
case WM_CLOSE:
PostQuitMessage(0);
//DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
const wchar_t* cg_name = L"DX11Sample";
int _stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int iCmdShow)
{
// ウィンドウクラス初期化
WNDCLASSEXW wcex =
{
sizeof(WNDCLASSEX),
CS_HREDRAW | CS_VREDRAW,
(WNDPROC)WndProc,
0, 0,
hInstance,
NULL, NULL,
(HBRUSH)GetStockObject(WHITE_BRUSH),
NULL,
cg_name,
NULL
};
if (!RegisterClassEx(&wcex)) { return 0; }
RECT clientRect = { 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT };
AdjustWindowRect(&clientRect, WS_OVERLAPPEDWINDOW, FALSE);
HWND hwnd = CreateWindowExW(NULL, cg_name, cg_name,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0,
clientRect.right - clientRect.left,
clientRect.bottom - clientRect.top,
NULL, NULL, hInstance, NULL);
if (!hwnd) { return 0; }
// D3D初期化
initD3D11(hwnd);
ShowWindow(hwnd, iCmdShow);
// メッセージループ
MSG msg;
do {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
// Direct3Dの処理
render();
}
} while (msg.message != WM_QUIT);
cleanup();
return 0;
}
D3D11 WARNING: Process is terminating. Using simple reporting. Please call ReportLiveObjects() at runtime for standard reporting. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Producer at 0x00FB23F4, Refcount: 14. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CFE1F8, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C5D0E8, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C5FFDC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C60464, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C6060C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C607BC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C60964, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C60B18, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C6137C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CC85C4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C90ADC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02D12034, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C90DF4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CE6308, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CC8B7C, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CCE344, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C3179C, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C31A84, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C31C2C, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C96E3C, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C9CCB4, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02C9CEAC, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CA6694, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CA7B34, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CBA664, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02CBAF8C, Refcount: 2. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x02D109DC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object : 27 [ STATE_CREATION WARNING #0: UNKNOWN]
DXGI WARNING: Live Producer at 0x00F8A004, Refcount: 5. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live Object at 0x00F92BA0, Refcount: 3. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live Object : 1 [ STATE_CREATION WARNING #0: ]
コードのどこに問題点があるか、あるいはDirectXSDKインストールの他に必要な設定があるか等
ご存知でしたら教えて頂けますと助かります。
どうぞよろしくお願い致します。