Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
ВнизIDirect3DTexture9 самый простой способ копирования данных с HDC. Найти похожие ветки
← →
Холивар (2009-06-21 23:22) [0]Или попиксельно.
Конечно можно использовать IDirect3DTexture9::GetSurfaceLevel и затем уже IDirect3DSurface9::GetDC но данная строчка:
IDirect3DSurface9::GetDC is valid on the following formats only: D3DFMT_R5G6B5, D3DFMT_X1R5G5B5, D3DFMT_R8G8B8, and D3DFMT_X8R8G8B8. Formats that contain Alpha are not supported because the GDI implementations don"t have a well-defined behavior on the alpha channel.
А как можно скопировать данные с форматом D3DFMT_A8R8G8B8?
← →
Sapersky (2009-06-22 14:06) [1]Вообще, наверное, блокировкой - Lock или LockRect, не помню точно как оно называется в DX9. Копирование - это просто Move, никаких сложностей с реализацией возникнуть не должно.
Что касается скорости - зависит от типа текстуры, если managed - никаких проблем, DX при блокировке просто возьмёт данные из сист. памяти. Если текстура существует только в видеопамяти (render target и т.п.), то на некоторых картах, возможно, будет быстрее сценарий "создать поверхность в сист. памяти, копировать туда CopyRects, потом взять данные из этой повехности". Хотя насчёт CopyRects не уверен, я проверял с DX7.surface.Blt.
З.Ы. Подобные вопросы уместнее задавать в Медиа/Играх. Они не так мертвы, как кажутся :)
← →
Холивар (2009-06-22 20:43) [2]Разобрался.
Просто текстуру нужно создавать в таком форматеif (FAILED(D3DXCreateTexture(fd3dDevice, fTexBmp->GetWidth(), fTexBmp->GetHeight(), D3DX_DEFAULT, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &f3DTexture)))
return false;
LPDIRECT3DSURFACE9 lTexSurface;
if (FAILED(f3DTexture->GetSurfaceLevel(0, &lTexSurface)))
return false;
HDC surDC;
if (FAILED(lTexSurface->GetDC( &surDC)))
return false;
Gdiplus::Graphics* texGraph;
texGraph = new Gdiplus::Graphics(surDC);
texGraph->SetInterpolationMode(Gdiplus::InterpolationModeNearestNeighbor);
texGraph->DrawImage(fTexBmp, 0,0, fTexBmp->GetWidth(), fTexBmp->GetHeight());
//write text GDI+
Gdiplus::Font gpFont(L"Arial", 8);
Gdiplus::PointF origin(0,0);
Gdiplus::SolidBrush gpBrush(Gdiplus::Color(255, 255, 0, 0));
//string
wchar_t lbuff[100];
wsprintf(lbuff,L"%d", fSceneCount);
//draw text
texGraph->DrawString(lbuff,-1,&gpFont,origin,&gpBrush);
delete texGraph;
lTexSurface->ReleaseDC(surDC);
lTexSurface->Release();
А вот если добавить в флаги D3DUSAGE_DYNAMIC то уже не работает
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c