无法从 Direct2D png 使用 DirectX9 绘制图像精灵
Can't draw image sprite with DirectX9 from Direct2D png
我正在尝试将一些Direct2D绘图合并到Ogre项目中。 目前Ogre只真正支持DirectX9,这在使用Direct2D时会导致一些复杂化。 我的解决方案是这样的。 使用 Direct2D 将我的叠加层绘制到 png,然后使用 DirectX 将图像绘制到精灵。 我尝试使用此方法,一旦绘制方法完成,子画面就损坏了。首先是 Direct2D 绘图代码:
void SceneManager::_initalize( void ){
// Initalize the bitmiap
hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
reinterpret_cast<void **>(&pWICFactory)
);
// Initalize Direct2D
if(SUCCEEDED(hr)){
hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory );
}
if(SUCCEEDED(hr)){
hr = pWICFactory->CreateBitmap(
rc.right - rc.left,
rc.bottom - rc.top,
GUID_WICPixelFormat8bppAlpha,
WICBitmapCacheOnLoad,
&pBitMap
);
}
if(SUCCEEDED(hr)){
hr = pD2DFactory->CreateWicBitmapRenderTarget(
pBitMap,
D2D1::RenderTargetProperties(),
&pRenderTarget
);
}
if(SUCCEEDED(hr)){
hr = pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(1,1,1,1), &pWhiteBrush);
}
// Draw to the bitmap here :)
if(SUCCEEDED(hr)){
pRenderTarget->BeginDraw();
pRenderTarget->Clear(D2D1::ColorF(0,0,0,0));
pRenderTarget->FillRectangle( D2D1::RectF( 0, 0, 500, 500), pWhiteBrush);
pRenderTarget->EndDraw();
}
if(SUCCEEDED(hr)){
hr = pWICFactory->CreateStream(&pStream);
}
WICPixelFormatGUID format = GUID_WICPixelFormat8bppAlpha;
if(SUCCEEDED(hr)){
hr = pStream->InitializeFromFilename(L"c:\tmp\dsplyr.xmg", GENERIC_WRITE);
}
if(SUCCEEDED(hr)){
hr = pWICFactory->CreateEncoder(GUID_ContainerFormatPng, NULL, &pEncoder);
}
if(SUCCEEDED(hr)){
hr = pEncoder->Initialize(pStream, WICBitmapEncoderNoCache);
}
if(SUCCEEDED(hr)){
hr = pEncoder->CreateNewFrame(&pFrameEncode, NULL);
}
if(SUCCEEDED(hr)){
hr = pFrameEncode->Initialize(NULL);
}
if(SUCCEEDED(hr)){
hr = pFrameEncode->SetSize(rc.right - rc.left, rc.bottom - rc.top);
}
if(SUCCEEDED(hr)){
hr = pFrameEncode->SetPixelFormat(&format);
}
if(SUCCEEDED(hr)){
hr = pFrameEncode->WriteSource(pBitMap, NULL);
}
if(SUCCEEDED(hr)){
hr = pFrameEncode->Commit();
}
if(SUCCEEDED(hr)){
hr = pEncoder->Commit();
}
if(!SUCCEEDED(hr)){
MessageBox(NULL, L"ERROR!", L"ERROR!", MB_OKCANCEL);
}
}
这是绘制的代码:
void SceneManager::Render( void ){
LPDIRECT3DDEVICE9 pd3dDevice = NULL; // Our rendering device
LPD3DXSPRITE d3dspt;
LPDIRECT3DTEXTURE9 sprite;
mWindow->getCustomAttribute("D3DDEVICE", &pd3dDevice);
D3DXCreateSprite(pd3dDevice, &d3dspt);
//D3DXCreateTextureFromFileInMemory(pd3dDevice, pBitMap, sizeof(pBitMap) , &sprite);
D3DXCreateTextureFromFile(pd3dDevice, L"c:\tmp\testxmg" , &sprite);
d3dspt->Begin( D3DXSPRITE_ALPHABLEND );
D3DXVECTOR3 center(0,0,0);
D3DXVECTOR3 position(0,0,0);
d3dspt->Draw(sprite, &rc, ¢er, &position, D3DCOLOR_XRGB(255,255,255));
d3dspt->End();
sprite->Release();
d3dspt->Release();
}
错误发生在此行 d3dspt->End();
这是错误:
First-chance exception at 0x000007FA34B51F9C (D3DX9_43.dll) in GUI.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
Unhandled exception at 0x000007FA34B51F9C (D3DX9_43.dll) in GUI.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
显然,d3dspt 正在损坏,因为它的地址现在0xFFFFFFFFFFFFFFFF。 我不知道为什么会这样。 将继续调试并尝试找到我的问题的解决方案,但是SO的任何输入都会很棒!:)
环境信息:Microsfot Visual Studio 2012C++食人魔 1.9DirectX9直接2D
啊。 看起来文件在创建后仍处于锁定状态。 必须"->Release()
"流和缓冲区等。 认为我将尝试将文件写入内存,这样我就不必在每一帧中重新分配这些文件。
相关文章:
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- SFML 文本未绘制在窗口上
- 如何在快板的屏幕中显示子位图的绘制?
- 如何绘制自定义形状的元素?
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 绘制文本问题
- 在 QT C++中绘制/操作多边形
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 在现代OpenGL中,绘制GL_TRIANGLE奇怪的z轴行为的填充圆
- 无法从 Direct2D png 使用 DirectX9 绘制图像精灵
- Directx9绘制模型的方法