这个其实是3D绘图里嵌入2D绘图的传统方式。
D3D9直接使用GDI/GDI+就可以画图,只不过需要额外的设置,而且只支持RGB和XRGB,不支持ARGB。因此这种方法比较适合合成UI元素和不透明的纹理贴图,不适合将要进行AlphaBlend操作的纹理贴图。ARGB贴图的合成要通过手动上传Gdiplus::Bitmap来实现。
使用GDI+画图的步骤:
D3D10/D3D11也差不多,只不过要设置的东西比较多。具体设置方法请参见MSDN。
不过D3D10.1可以用D2D1,D3D11可以用D2D1.1,一般没有必要使用GDI/GDI+合成2D图片。除非要在D3D11里使用,但是却不允许使用D2D1.1,才需要使用GDI/GDI+合成2D图片。
<code class="language-cpp">// d3d9gdi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> #include <d3d9.h> #include <stdlib.h> #include <gdiplus.h> #include "resource.h" #pragma comment(lib, "d3d9") #pragma comment(lib, "gdiplus") using namespace Gdiplus; INT_PTR __stdcall DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HMODULE rastlib; static IDirect3D9Ex *d3d; static IDirect3DDevice9Ex *dev; RECT rcc; GetClientRect(hWnd, &rcc); D3DPRESENT_PARAMETERS pp = {}; pp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; // 重要:兼容GDI pp.SwapEffect = D3DSWAPEFFECT_DISCARD; pp.Windowed = TRUE; if (msg == WM_INITDIALOG) // 创建 { // 创建D3D9设备 Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d); HRESULT hr = d3d->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, NULL, &dev); if (FAILED(hr)) { if (!rastlib) rastlib = LoadLibrary(L"rgb9rast.dll"); if (!rastlib) rastlib = LoadLibrary(L"rgb9rast_2.dll"); if (rastlib) { d3d->RegisterSoftwareDevice(GetProcAddress(rastlib, "D3D9GetSWInfo")); d3d->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_SW, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, NULL, &dev); } } return TRUE; } if (msg == WM_SIZE) // 窗口大小变化 { dev->ResetEx(&pp, NULL); } if (msg == WM_ERASEBKGND) // 防闪烁 return TRUE; if (msg == WM_PAINT) // 需要重绘 { // 移除WM_PAINT消息 PAINTSTRUCT ps; BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); // 使用D3D9绘制 // 清屏 dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0); // 获取GDI句柄 IDirect3DSurface9 *surface; dev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &surface); HDC hdc = NULL; HRESULT hr = surface->GetDC(&hdc); // 使用GDI+绘制 if (1) { Graphics g(hdc); SolidBrush brush(Color::Black); Font font(L"Arial", 16); g.DrawString(L"我是中文!", 5, &font, PointF(10, 10), &brush); } // 释放GDI句柄 surface->ReleaseDC(hdc); surface->Release(); // 上屏 dev->PresentEx(NULL, NULL, NULL, NULL, 0); return TRUE; } if (msg == WM_DESTROY) // 窗口销毁 { // 清理资源 dev->Release(); d3d->Release(); return FALSE; } if (msg == WM_COMMAND) { WORD nID = LOWORD(wParam); if (nID == IDCANCEL) // 对话框取消 { EndDialog(hWnd, IDCANCEL); return TRUE; } } return FALSE; } int main() { DWORD_PTR gdiplustoken; GdiplusStartup(&gdiplustoken, &GdiplusStartupInput(), NULL); DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); GdiplusShutdown(gdiplustoken); return 0; } </gdiplus.h></stdlib.h></d3d9.h></windows.h></code>
[修改于 7年9个月前 - 2017/03/28 00:27:54]
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |