Files
lity3d/Demo/d3d11_test.c
T
shuiyu1123 2d56cb3bc9 MiMoEngine ASM: x86-64 MASM汇编+C混合架构游戏引擎
核心热路径(数学/内存/字符串/性能分析)用MASM汇编(SSE/AVX2)
外围系统(窗口/渲染/ECS/音频/UI/脚本)用C语言
含自研编辑器、VisualScript积木编程、中文渲染(glyph_atlas)
2026-07-10 19:20:40 +08:00

96 lines
3.1 KiB
C

// 独立 D3D11 测试 - 不依赖引擎框架
#include <windows.h>
#include <d3d11.h>
#include <dxgi.h>
#include <stdio.h>
#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;
}