// 独立 D3D11 测试 - 不依赖引擎框架 #include #include #include #include #pragma comment(lib, "d3d11.lib") #pragma comment(lib, "dxgi.lib") static ID3D11Device* device = NULL; static ID3D11DeviceContext* context = NULL; static IDXGISwapChain* swap_chain = NULL; static ID3D11RenderTargetView* rtv = NULL; static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_DESTROY) { PostQuitMessage(0); return 0; } return DefWindowProcW(hwnd, msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { (void)hPrevInstance; (void)lpCmdLine; (void)nCmdShow; // 注册窗口类 WNDCLASSEXW wc = {0}; wc.cbSize = sizeof(WNDCLASSEXW); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = L"D3D11Test"; RegisterClassExW(&wc); // 创建窗口 HWND hwnd = CreateWindowExW(0, L"D3D11Test", L"D3D11 Test", WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); // 创建 D3D11 设备和交换链 DXGI_SWAP_CHAIN_DESC scd = {0}; scd.BufferCount = 1; scd.BufferDesc.Width = 800; scd.BufferDesc.Height = 600; scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; scd.BufferDesc.RefreshRate.Numerator = 60; scd.BufferDesc.RefreshRate.Denominator = 1; scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; scd.OutputWindow = hwnd; scd.SampleDesc.Count = 1; scd.Windowed = TRUE; scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; D3D_FEATURE_LEVEL levels[] = {D3D_FEATURE_LEVEL_11_0}; HRESULT hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, levels, 1, D3D11_SDK_VERSION, &scd, &swap_chain, &device, NULL, &context); if (FAILED(hr)) { MessageBoxW(hwnd, L"D3D11 CreateDevice Failed!", L"Error", MB_OK); return -1; } // 创建渲染目标 ID3D11Texture2D* back_buffer = NULL; swap_chain->lpVtbl->GetBuffer(swap_chain, 0, &IID_ID3D11Texture2D, (void**)&back_buffer); device->lpVtbl->CreateRenderTargetView(device, (ID3D11Resource*)back_buffer, NULL, &rtv); back_buffer->lpVtbl->Release(back_buffer); // 设置渲染目标 context->lpVtbl->OMSetRenderTargets(context, 1, &rtv, NULL); // 主循环 MSG msg = {0}; while (msg.message != WM_QUIT) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } // 清屏 - 蓝色 float color[4] = {0.2f, 0.5f, 0.8f, 1.0f}; context->lpVtbl->ClearRenderTargetView(context, rtv, color); // 呈现 swap_chain->lpVtbl->Present(swap_chain, 0, 0); } // 清理 rtv->lpVtbl->Release(rtv); swap_chain->lpVtbl->Release(swap_chain); context->lpVtbl->Release(context); device->lpVtbl->Release(device); return 0; }