标签: direct2d

WIC位图处理最有效的像素格式是什么?

我正在尝试使用Direct2D和WIC Bitmap制作一个简单的视频播放器.
它需要YUV像素格式帧数据的快速和CPU经济绘制(具有拉伸).

我已经用GDI测试了.我希望切换到Direct2D可以获得至少10倍的性能提升(较小的CPU开销).

我要做的基本上如下:

  1. 创建一个空的WIC位图A(用于绘制画布)
  2. 使用YUV帧数据创建另一个WIC位图B(格式转换)
  3. 将位图B绘制到A上,然后将A绘制到D2D渲染目标

对于1,2步,我必须选择像素格式.
WIC Native Pixel格式

有一个MSDN页面推荐WICPixelFormat32bppPBGRA.
http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx

有什么区别WICPixelFormat32bppPBGRAWICPixelFormat32bppBGRA?(前者有额外的P)

如果WICPixelFormat32bppPBGRA是要走的路,总是这样吗?无论硬件和/或配置?

实际上WIC位图处理最有效的像素格式是什么?

windows wic direct2d

2
推荐指数
1
解决办法
1563
查看次数

投射正确性 - ID2D1Brush到ID2D1SolidColorBrush(DirectX)

我需要创建一个ID2D1SolidColorBrush,我有一个指针ID2D1Brush.我用我ID2D1HwndRenderTarget来创建纯色画笔:

ID2D1Brush* brush = nullptr;

myRenderTarget->CreateSolidColorBrush(color, 
                 reinterpret_cast<ID2D1SolidColorBrush**>(&brush));
Run Code Online (Sandbox Code Playgroud)

上面的代码有效,但我想知道这是否reinterpret_cast是正确的选择.

c++ directx casting direct2d c++11

2
推荐指数
1
解决办法
343
查看次数

无法创建Direct2D DXGI Surface

我叫这个方法:

http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx

呼叫失败了E_NOINTERFACE.文档对于为什么会发生这种情况特别无益.我启用了所有DirectX 11调试的东西,这是我得到的最好的.我知道我有一个有效的IDXGISurface1*(也尝试过IDXGISurface),其他参数设置正确.关于为什么这个电话会失败的任何想法?

编辑:

我也在创建D3D11设备时遇到问题.如果我将nullptr作为D3D11CreateDeviceAndSwapChain中的IDXGIAdapter*参数传递,它可以正常工作,但是如果我自己枚举适配器并传入一个指针(唯一返回的),它将失败并带有无效参数.MSDN文档明确说明如果传递nullptr,则系统使用EnumAdapters1的第一个返回.我正在运行DX11系统.

directx-11 direct2d c++11

1
推荐指数
1
解决办法
3757
查看次数

在Direct2D应用程序中处理HRESULT

在Kenny Kerr的msdn杂志关于成像和Direct2D的文章中,他经常使用HR()宏.

在他的Windows Imaging Component文章中 - http://msdn.microsoft.com/en-gb/magazine/cc500647.aspx

他写 -

最后,WIC API使用HRESULT来描述错误.本文中的示例使用HR宏来清楚地标识方法返回需要检查的HRESULT的位置.您可以使用自己的错误处理策略替换它 - 无论是抛出异常还是自己返回HRESULT.

HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));
Run Code Online (Sandbox Code Playgroud)

然而肯尼没有表现出他的定义HR().我是一名C++初学者,我正在尝试发现并理解代码的细节.我想知道他的实现HR()是什么,以便我可以考虑如何最好地处理HRESULT我的程序.我已经搜索了一个定义,但似乎没有这些特定文章的源代码.

在了解macros我的同时,我发现了这些最近提出使用inline函数而不是宏的文档-

http://msdn.microsoft.com/en-us/library/vstudio/ttsbh614.aspx

http://msdn.microsoft.com/en-us/library/vstudio/z8y1yy88.aspx

谁能告诉我Kenny如何定义他的HR()宏?它实际上做了什么?

我的Direct2D程序应如何处理HRESULT?正确使用HRESULTs以使程序可靠且有弹性的方法是什么?

c++ directx hresult direct2d

1
推荐指数
1
解决办法
682
查看次数

如何确定是否使用' - >'与'.'

我正在关注D2D示例,其中出现了以下代码:

    if(!(D2D1_WINDOW_STATE_OCCLUDED & m_renderTarget->CheckWindowState()))
    {
        m_renderTarget->BeginDraw();

        Draw();

        if(m_renderTarget->EndDraw() == D2DERR_RECREATE_TARGET)
        {
            m_renderTarget.Reset();
            Invalidate();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我注意到m_renderTarget使用了 - >(我忘记了它的名字),后来又使用了点运算符.出于某种原因,我认为使用只能使用一个或另一个,具体取决于它是引用类型还是值类型.显然我认为错了,但找不到关于何时使用每个操作员的任何信息(或更多关于点,每个操作员的目的.)

任何澄清将不胜感激.

c++ windows direct2d

1
推荐指数
1
解决办法
151
查看次数

Windows API从文件渲染图像(初学者)

我试图了解如何使用Windows API,Direct2D和Visual C++从文件加载和呈现图像.我或多或少地试图关注有关此主题的MSDN文章.我是C++(在C中经验丰富)和Windows API的新手.

我写了3个函数.

HRESULT imagefactorysetup(IWICImagingFactory * pImageFactory)
{
    HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (LPVOID *) &pImageFactory);

    return hr;
}

HRESULT imageload(LPCWSTR filename, IWICImagingFactory * pImageFactory, IWICBitmapFrameDecode * pFrame)
{
    IWICBitmapDecoder * pDecoder = NULL;
    HRESULT hr = pImageFactory->CreateDecoderFromFilename(filename, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder);

    if (SUCCEEDED(hr))
        hr = pDecoder->GetFrame(0, &pFrame);

    //Format convert the frame to 32bppPBGRA
    IWICFormatConverter * pFormatConverter = NULL;
    if (SUCCEEDED(hr))
    {
        SafeRelease(&pFormatConverter);
        hr = pImageFactory->CreateFormatConverter(&pFormatConverter);
    }

    if (SUCCEEDED(hr))
        hr = pFormatConverter->Initialize(pFrame, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, …
Run Code Online (Sandbox Code Playgroud)

c++ winapi wic direct2d

1
推荐指数
1
解决办法
2794
查看次数

Direct2D CreateTextLayout() - 如何获取插入符号坐标

我使用Direct2D从文本布局开始渲染文本

HRESULT hr = m_spWriteFactory->CreateTextLayout(
        m_wsText.c_str( ),
        m_wsText.length( ),
        m_spWriteTextFormat.Get( ),
        m_rect.right - m_rect.left - m_spacing.right - m_spacing.left,
        m_rect.bottom - m_rect.top - m_spacing.top - m_spacing.bottom,
        &m_spTextLayout
        );
Run Code Online (Sandbox Code Playgroud)

然后将其渲染为我稍后与Direct3D一起使用的位图

m_sp2DDeviceContext->DrawTextLayout(
                D2D1::Point2F( m_spacing.left, m_spacing.top ),
                m_spTextLayout.Get( ),
                m_spTextBrush.Get( )
                );
Run Code Online (Sandbox Code Playgroud)

我想画一条简单的闪烁线作为插入符号.我知道如何绘制线条以及如何使其显示/消失.

问题:如何获得插入线的起点和终点坐标?

简化:如果它是很容易假设文本由一个只有一行,那么也没关系.但是,当然会有更普遍的解决方案.

c++ directx direct2d

1
推荐指数
1
解决办法
1877
查看次数

如何在本机桌面Windows应用程序中使用Direct2D呈现子窗口?

我有一个桌面应用程序,其中所有窗口(HWND)使用Direct2D 1.1自行渲染.我的问题是如何更正确地做到这一点

每个窗口是否都有自己的Direct2D设备上下文派生自一个Direct2D设备?在这种情况下,我无法在没有额外技巧的情况下在子窗口上呈现透明内容(我必须在父窗口的上下文中更改目标,将父窗口呈现为Direct2D位图,然后在子目标上绘制此位图).

也许最好有一个Direct2D设备上下文,所有窗口都呈现自己?我相信DirectComposition以类似的方式工作.不幸的是,我无法使用它,因为我的目标是Windows 7.

c++ transparency direct2d

1
推荐指数
1
解决办法
1075
查看次数

如何转换DirectWrite文本对象之一,同时保持其他文本对象不变

我在同一个渲染目标上有几个DirectWrite文本对象,我想一次转换其中一个,同时保持其他没有变化,在Direct2D中,有几种类型的转换

  • 渲染目标变换
  • 几何变换
  • 刷变换

我不能使用渲染目标变换,因为它会影响它上面的所有对象

我不能使用几何变换,因为文本不是几何,并且IDWriteTextLayout没有变换方法.

所以对我来说唯一的选择是画笔变换,但是当我尝试使用实心画笔绘制一个变换的矩形时,它仍然在原始位置绘制它(参见下面的代码),sdk demo演示了一个位图画笔变换的例子,所以我的问题是:转换是否适用于其他类型的画笔?像实心刷?

这是我的代码,首先,根据经过的时间计算转换矩阵,然后使用此矩阵转换画笔,最后绘制矩形.请看一下,告诉我是否是这种情况,或者我是否可以用其他方式做到这一点?

VOID CalculateTranslationMatrix(D2D1_MATRIX_3X2_F* matrix) 
{ 
    static float totalTime = 0.0f; 

    // Get start time 
    static DWORD startTime = timeGetTime(); 

    // Get current time 
    DWORD currentTime = timeGetTime(); 

    // Calculate time elapsed 
    float timeElapsed = (currentTime - startTime) * 0.001f; 

    // Accumulate total time elapsed 
    totalTime += timeElapsed; 

    // Build up the translation matrix 
    matrix->_11 = 1.0f; 
    matrix->_12 = 0.0f; 
    matrix->_21 = 0.0f; 
    matrix->_22 = 1.0f; 
    matrix->_31 = totalTime; 
    matrix->_32 = totalTime; 
} …
Run Code Online (Sandbox Code Playgroud)

direct2d directwrite

0
推荐指数
1
解决办法
894
查看次数