渲染目标就是您的程序将绘制的位置。通常,渲染目标是一个窗口(具体来说,窗口的客户区域)。它也可能是内存中的一个位图,不会显示。渲染目标由ID2D1RenderTarget接口表示。
设备是代表实际绘制像素的抽象。硬件设备使用GPU来提高性能,而软件设备使用CPU。该应用程序不会创建该设备。相反,当应用程序创建渲染目标时,该设备是隐式创建的。每个渲染目标都与特定设备相关联,无论是硬件还是软件。
显示渲染目标和设备之间关系的图表。
资源是程序用于绘图的对象。以下是在Direct2D中定义的资源的一些示例:
- 刷。控制如何绘制线条和区域。画笔类型包括纯色画笔和渐变画笔。
- 笔画风格。控制线的外观,例如虚线或实线。
- 几何。表示线条和曲线的集合。
- 网格。三角形形成的形状。网格数据可以直接由GPU使用,而不像几何数据,在渲染之前必须转换。
渲染目标也被认为是一种资源。
一些资源从硬件加速中受益。此类资源总是与特定设备(硬件(GPU)或软件(CPU))相关联。这种类型的资源被称为依赖于设备。画笔和网格是设备相关资源的示例。如果设备不可用,则必须为新设备重新创建资源。
无论使用什么设备,其他资源都保存在CPU内存中。这些资源是设备无关的,因为它们不与特定设备相关联。当设备改变时,不需要重新创建与设备无关的资源。描边样式和几何形状是与设备无关的资源。
每个资源的MSDN文档说明资源是依赖于设备还是独立于设备。每个资源类型都由从ID2D1Resource派生的接口表示。例如,画笔由ID2D1Brush界面表示。
Direct2D工厂对象
使用Direct2D的第一步是创建Direct2D工厂对象的一个实例。在计算机编程中,工厂是创建其他对象的对象。Direct2D工厂创建以下类型的对象:
- 渲染目标。
- 独立于设备的资源,例如描边样式和几何图形。
依赖于设备的资源(如画笔和位图)由渲染目标对象创建。
显示Direct2D工厂的图表。
要创建Direct2D工厂对象,请调用D2D1CreateFactory函数。
ID2D1Factory *pFactory=NULL;
HRESULT hr=D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&pFactory);
第一个参数是一个标志,指定创建选项。 D2D1_FACTORY_TYPE_SINGLE_THREADED标志表示您不会从多个线程中调用Direct2D。要支持来自多个线程的调用,请指定D2D1_FACTORY_TYPE_MULTI_THREADED。如果您的程序使用单个线程调用Direct2D,则单线程选项效率更高。
D2D1CreateFactory函数的第二个参数接收一个指向ID2D1Factory接口的指针。
您应该在第一个WM_PAINT消息之前创建Direct2D工厂对象。 WM_CREATE消息处理程序是创建工厂的好地方:
case WM_CREATE:
if(FAILED(D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,
&pFactory
)))
return -1;// Fail CreateWindowEx.
return 0;
创建Direct2D资源
Circle程序使用以下设备相关的资源:
- 与应用程序窗口关联的呈现目标。
- 一个纯色画笔来画圆。
这些资源中的每一个都由COM接口表示:
- ID2D1HwndRenderTarget接口表示渲染目标。
- ID2D1SolidColorBrush接口表示画笔。
Circle程序将指向这些接口的指针存储为MainWindow类的成员变量:
ID2D1HwndRenderTarget *pRenderTarget;
ID2D1SolidColorBrush *pBrush;
以下代码创建这两个资源。
HRESULT MainWindow::CreateGraphicsResources(){
HRESULT hr=S_OK;
if(pRenderTarget==NULL){
RECT rc;
GetClientRect(m_hwnd,&rc);
D2D1_SIZE_U size=D2D1::SizeU(rc.right,rc.bottom);
hr=pFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_hwnd,size),
&pRenderTarget
);
if(SUCCEEDED(hr)){
const D2D1_COLOR_F color=D2D1::ColorF(1.0f,1.0f,0);
hr=pRenderTarget->CreateSolidColorBrush(color,&pBrush);
if(SUCCEEDED(hr))
CalculateLayout();
}
}
return hr;
}
要为窗口创建渲染目标,请在Direct2D工厂调用ID2D1Factory::CreateHwndRenderTarget方法。
- 第一个参数指定了任何类型的渲染目标所共有的选项。在这里,我们通过调用辅助函数D2D1::RenderTargetProperties来传递默认选项。
- 第二个参数指定窗口的句柄加上渲染目标的大小,以像素为单位。
- 第三个参数接收一个ID2D1HwndRenderTarget指针。
要创建纯色笔刷,请在渲染目标上调用ID2D1RenderTarget::CreateSolidColorBrush方法。颜色以D2D1_COLOR_F值的形式给出。有关Direct2D中颜色的更多信息,请参阅在Direct2D中使用颜色。
另外请注意,如果渲染目标已经存在,则CreateGraphicsResources方法将返回S_OK而不执行任何操作。这个设计的原因将在下一个主题中变得清晰。
下一个
使用Direct2D绘图