核心热路径(数学/内存/字符串/性能分析)用MASM汇编(SSE/AVX2) 外围系统(窗口/渲染/ECS/音频/UI/脚本)用C语言 含自研编辑器、VisualScript积木编程、中文渲染(glyph_atlas)
96 lines
3.1 KiB
C
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;
|
|
}
|