Windows桌面应用程序(1-2-4-5th) 渲染目标,设备和资源

渲染目标就是您的程序将绘制的位置。通常,渲染目标是一个窗口(具体来说,窗口的客户区域)。它也可能是内存中的一个位图,不会显示。渲染目标由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接口表示:

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绘图


原文链接:Render Targets, Devices, and Resources

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值