I fix it by d3d render texture in a windows thread.
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
//以下用于显示
ID3D11ShaderResourceView *textureView;
d3d11Device->CreateShaderResourceView(texture, nullptr, &textureView);
ShowWindow(hwnd, 1);
// Main Loop
bool isRunning = true;
while (isRunning)
{
MSG msg = {};
while (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
isRunning = false;
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
//Sleep(10*1000);
if (global_windowDidResize)
{
d3d11DeviceContext->OMSetRenderTargets(0, 0, 0);
d3d11FrameBufferView->Release();
HRESULT res = d3d11SwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
assert(SUCCEEDED(res));
ID3D11Texture2D *d3d11FrameBuffer;
res =
d3d11SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void **)&d3d11FrameBuffer);
assert(SUCCEEDED(res));
res =
d3d11Device->CreateRenderTargetView(d3d11FrameBuffer, NULL, &d3d11FrameBufferView);
assert(SUCCEEDED(res));
d3d11FrameBuffer->Release();
global_windowDidResize = false;
}
FLOAT backgroundColor[4] = {0.1f, 0.2f, 0.6f, 1.0f};
d3d11DeviceContext->ClearRenderTargetView(d3d11FrameBufferView, backgroundColor);
RECT winRect;
GetClientRect(hwnd, &winRect);
D3D11_VIEWPORT viewport = {0.0f,
0.0f,
(FLOAT)(winRect.right - winRect.left),
(FLOAT)(winRect.bottom - winRect.top),
0.0f,
1.0f};
d3d11DeviceContext->RSSetViewports(1, &viewport);
d3d11DeviceContext->OMSetRenderTargets(1, &d3d11FrameBufferView, nullptr);
d3d11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
d3d11DeviceContext->IASetInputLayout(inputLayout);
d3d11DeviceContext->VSSetShader(vertexShader, nullptr, 0);
d3d11DeviceContext->PSSetShader(pixelShader, nullptr, 0);
d3d11DeviceContext->PSSetShaderResources(0, 1, &textureView);
d3d11DeviceContext->PSSetSamplers(0, 1, &samplerState);
d3d11DeviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
d3d11DeviceContext->Draw(numVerts, 0);
d3d11SwapChain->Present(1, 0);
}
return 0;
}