在Windows Metro下使用DirectX绘制位图
我正在尝试使用DirectX创建并绘制位图,然后使用该位图绘制屏幕。我有下面的测试代码,这些代码是我从许多来源拼凑而成的。我似乎能够创建没有错误的位图,我尝试用红色填充它。然而,当我使用位图绘制屏幕时,我只得到一个黑色矩形。谁能告诉我我可能做错了什么?请注意,这是作为Windows 8 Metro应用程序运行的,如果这有区别的话 请注意,格式化程序似乎正在删除我的尖括号,我不知道如何阻止它这样做。“device”变量属于ID3D11Device类,“context”变量属于ID3D11DeviceContext类,d2dContext变量属于ID2D1DeviceContext类,dgixDevice变量属于IDXGIDevice类,而“d2dDevice”则属于ID2D1Device类在Windows Metro下使用DirectX绘制位图,directx,windows-8,microsoft-metro,Directx,Windows 8,Microsoft Metro,我正在尝试使用DirectX创建并绘制位图,然后使用该位图绘制屏幕。我有下面的测试代码,这些代码是我从许多来源拼凑而成的。我似乎能够创建没有错误的位图,我尝试用红色填充它。然而,当我使用位图绘制屏幕时,我只得到一个黑色矩形。谁能告诉我我可能做错了什么?请注意,这是作为Windows 8 Metro应用程序运行的,如果这有区别的话 请注意,格式化程序似乎正在删除我的尖括号,我不知道如何阻止它这样做。“device”变量属于ID3D11Device类,“context”变量属于ID3D11Devic
void PaintTestBitmap(GRectF& rect)
{
HRESULT hr;
UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1
};
ComPtr<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;
ComPtr<ID2D1DeviceContext> d2dContext;
hr = D3D11CreateDevice( NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
creationFlags,
featureLevels,
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION,
&device,
NULL,
&context);
if (SUCCEEDED(hr))
{
ComPtr<IDXGIDevice> dxgiDevice;
device.As(&dxgiDevice);
// create D2D device context
ComPtr<ID2D1Device> d2dDevice;
hr = D2D1CreateDevice(dxgiDevice.Get(), NULL, &d2dDevice);
if (SUCCEEDED(hr))
{
hr = d2dDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &d2dContext);
if (SUCCEEDED(hr))
{
ID2D1Bitmap1 *pBitmap;
D2D1_SIZE_U size = { rect.m_width, rect.m_height };
D2D1_BITMAP_PROPERTIES1 properties = {{ DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED }, 96, 96, D2D1_BITMAP_OPTIONS_TARGET, 0 };
hr = d2dContext->CreateBitmap(size, (const void *) 0, 0, &properties, &pBitmap);
if (SUCCEEDED(hr))
{
d2dContext->SetTarget(pBitmap);
d2dContext->BeginDraw();
d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red)); // Clear the bitmap to Red
d2dContext->EndDraw();
// If I now use pBitmap to paint to the screen, I get a black rectange
// rather than the red one I was expecting
}
}
}
}
}
void PaintTestBitmap(GRectF&rect)
{
HRESULT-hr;
UINT creationFlags=D3D11\u创建设备\u BGRA\u支持;
D3D_功能_级别功能级别[]=
{
D3D_特征_等级_11_1,
D3D_特征_等级_11_0,
D3D_功能_级别_10_1,
D3D_功能_级别_10_0,
D3D_功能_级别_9_3,
D3D_功能_级别_9_2,
D3D_功能_级别_9_1
};
ComPtr装置;
ComPtr语境;
ComPtr d2dContext;
hr=D3D11CreateDevice(空,
D3D_驱动器_类型_硬件,
无效的
creationFlags,
功能级别,
阵列化(功能级别),
D3D11_SDK_版本,
&装置,
无效的
&上下文);
如果(成功(hr))
{
ComPtr-dxgiDevice;
设备组件(&dxgDevice);
//创建D2D设备上下文
ComPtr-d2dDevice;
hr=D2D1CreateDevice(dxgiDevice.Get(),NULL,&d2dDevice);
如果(成功(hr))
{
hr=d2dDevice->CreateDeviceContext(D2D1\u设备\u上下文\u选项\u无,&d2dContext);
如果(成功(hr))
{
ID2D1Bitmap1*pBitmap;
D2D1_SIZE_SIZE={rect.m_width,rect.m_height};
D2D1_位图_属性1属性={{DXGI_格式{R8G8B8A8_UNORM,D2D1_ALPHA_模式{U预乘},96,96,D2D1_位图_选项{U目标,0};
hr=d2dContext->CreateBitmap(大小,(常量void*)0、0、属性和pBitmap);
如果(成功(hr))
{
d2dContext->SetTarget(pBitmap);
d2dContext->BeginDraw();
d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red));//将位图清除为红色
d2dContext->EndDraw();
//如果我现在使用pBitmap绘制屏幕,我会得到一个黑色的矩形
//而不是我期待的红色
}
}
}
}
}
请注意,我对DirectX和Metro风格的应用程序都相当陌生
谢谢您可能忘记的是您没有在上下文中绘制位图 你可以尝试的是
hr = d2dContext->CreateBitmap(size, (const void *) 0, 0, &properties, &pBitmap);
if (SUCCEEDED(hr))
{
ID2D1Image *pImage = nullptr;
d2dContext->GetTarget(&image);
d2dContext->SetTarget(pBitmap);
d2dContext->BeginDraw();
d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red)); // Clear the bitmap to Red
d2dContext->SetTarget(pImage);
d2dContext->DrawBitmap(pBitmap);
d2dContext->EndDraw();
}
您要做的是存储渲染目标,然后绘制位图,最后将您的上下文设置为正确的渲染目标,并让它在上面绘制您的位图快速浏览即可。我会研究位图格式,因为我相信D2D更喜欢BGRA,并且你如何渲染到屏幕可能会影响你的结果。谢谢你的反馈。我尝试将像素格式更改为DXGI_格式_B8G8R8A8_UNORM(带alpha和不带alpha),但仍然得到相同的结果。您知道如何使用DirectX写入位图的任何示例吗?谢谢你可以看看这个样品:或者你可以看看其他D2D样品