Dx11中的2D显示抛弃了Dx8和Dx9中的 ID3DxSprite 绘制精灵,也出乎意料的(出乎我的意料 :) )没有采用顶点方式而是返璞归真走向了表面。现在的Direct2D更像是GDI了~~~
DX11上Direct2D的第一个例题就是绘制一个笔刷~~这在原来是不可能实现的;原来的ID3DxSprite 只能够绘制基于纹理的格式,比如我们要做一个效果,当选中一个Button的时候,这个Button边界线会高亮显示,这在原来必须依靠制作这样的纹理来实现,现在不同了,你可以定义一个线条笔刷,给他个范围,画一个矩形就完成了!~~
Creating a Simple Direct2D Application
这个立体绘制了一个矩形框,一个蓝色填充的矩形和网格的背景;这些都是Direct2D自己绘制的,没有用任何的纹理。
我们这个程序使用的是一个标准的Win32API程序,和微软标准的例题不一样,要比那个简单。
1)头文件
// Windows Header Files: #pragma once // Windows 头文件: #include <windows.h> #include <tchar.h>这几个头文件是win32平台必须的头文件,外加Dx11的2D头文件,这里不用倒入Dx11的头文件,因为Direct2D和Dx11的3D库是相对独立的。
#include <d2d1.h>
与之相关的lib库是D2d1.lib,它的名字是D2d1,估计也是尝试性的一个库,以后还会出D2d2,D2d3.....
//-----------------全局变量------------------------------ HINSTANCE hInst; // 当前实例 ID2D1Factory* pD2DFactory = NULL; // 2D工厂 ID2D1SolidColorBrush* pBlackBrush = NULL; // 实例笔刷 ID2D1HwndRenderTarget* m_pRenderTarget = NULL; // 渲染面
创建一个函数,初始化2D环境
LRESULT InItD2D(HWND hWnd) { //创建一个单线程irect2D资源指针 HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&pD2DFactory); // Obtain the size of the drawing area. GetClientRect(hWnd, &rc); // Create a Direct2D render target // 根据窗口大小生成一个渲染表面 hr = pD2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(hWnd,D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)), &m_pRenderTarget); // 在表面上加入3个笔刷 if (SUCCEEDED(hr)) { m_pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::SteelBlue),&pBlackBrush); m_pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Gray),&pSteelBlueBrush); m_pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::GreenYellow),&pGreenBrush); } return hr; }
生成笔刷以后,就可以绘制表面了
VOID Rander() { if(!m_pRenderTarget) return ; m_pRenderTarget->BeginDraw(); m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); // Draw a grid background for (int x = 0; x < width; x += 10) { //画格子线 m_pRenderTarget->DrawLine( D2D1::Point2F(static_cast<FLOAT>(x), 0.0f), D2D1::Point2F(static_cast<FLOAT>(x), height), pGreenBrush, 0.5f ); } for (int y = 0; y < height; y += 10) { m_pRenderTarget->DrawLine( D2D1::Point2F(0.0f, static_cast<FLOAT>(y)), D2D1::Point2F(width, static_cast<FLOAT>(y)), pGreenBrush, 0.5f ); } // 画矩形线框 m_pRenderTarget->DrawRectangle( D2D1::RectF(rc.left + 200.0f,rc.top + 200.0f,rc.right - 200.0f,rc.bottom - 200.0f), pSteelBlueBrush); // 画矩形区域 m_pRenderTarget->FillRectangle( D2D1::RectF(rc.left + 300.0f,rc.top + 300.0f,rc.right - 300.0f,rc.bottom - 300.0f), pBlackBrush); m_pRenderTarget->EndDraw(); }