我正在尝试使用Direct2D和WIC Bitmap制作一个简单的视频播放器.
它需要YUV像素格式帧数据的快速和CPU经济绘制(具有拉伸).
我已经用GDI测试了.我希望切换到Direct2D可以获得至少10倍的性能提升(较小的CPU开销).
我要做的基本上如下:
对于1,2步,我必须选择像素格式.
WIC Native Pixel格式
有一个MSDN页面推荐WICPixelFormat32bppPBGRA.
http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx
有什么区别WICPixelFormat32bppPBGRA和WICPixelFormat32bppBGRA?(前者有额外的P)
如果WICPixelFormat32bppPBGRA是要走的路,总是这样吗?无论硬件和/或配置?
实际上WIC位图处理最有效的像素格式是什么?
我需要创建一个ID2D1SolidColorBrush,我有一个指针ID2D1Brush.我用我ID2D1HwndRenderTarget来创建纯色画笔:
ID2D1Brush* brush = nullptr;
myRenderTarget->CreateSolidColorBrush(color,
reinterpret_cast<ID2D1SolidColorBrush**>(&brush));
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,但我想知道这是否reinterpret_cast是正确的选择.
我叫这个方法:
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系统.
在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以使程序可靠且有弹性的方法是什么?
我正在关注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使用了 - >(我忘记了它的名字),后来又使用了点运算符.出于某种原因,我认为使用只能使用一个或另一个,具体取决于它是引用类型还是值类型.显然我认为错了,但找不到关于何时使用每个操作员的任何信息(或更多关于点,每个操作员的目的.)
任何澄清将不胜感激.
我试图了解如何使用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) 我使用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)
我想画一条简单的闪烁线作为插入符号.我知道如何绘制线条以及如何使其显示/消失.
问题:如何获得插入线的起点和终点坐标?
简化:如果它是很容易假设文本由一个只有一行,那么也没关系.但是,当然会有更普遍的解决方案.
我有一个桌面应用程序,其中所有窗口(HWND)使用Direct2D 1.1自行渲染.我的问题是如何更正确地做到这一点?
每个窗口是否都有自己的Direct2D设备上下文派生自一个Direct2D设备?在这种情况下,我无法在没有额外技巧的情况下在子窗口上呈现透明内容(我必须在父窗口的上下文中更改目标,将父窗口呈现为Direct2D位图,然后在子目标上绘制此位图).
也许最好有一个Direct2D设备上下文,所有窗口都呈现自己?我相信DirectComposition以类似的方式工作.不幸的是,我无法使用它,因为我的目标是Windows 7.
我在同一个渲染目标上有几个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 ×9
c++ ×6
directx ×3
c++11 ×2
wic ×2
windows ×2
casting ×1
directwrite ×1
directx-11 ×1
hresult ×1
transparency ×1
winapi ×1