Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.008 c
15-1245250048
Empleado
2009-06-17 18:47
2009.08.23
Если бы у наших маленьких детей был свой форум, какие бы темы ...


2-1245831668
Polkin
2009-06-24 12:21
2009.08.23
Убрать XPManifest


2-1245840591
Sly_Laban
2009-06-24 14:49
2009.08.23
*.doc-файл из RichEdit a


6-1206045254
anton
2008-03-20 23:34
2009.08.23
навигация в веббраузер


15-1245224865
Cobalt
2009-06-17 11:47
2009.08.23
комп загружается с 5 - 6 раза