Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.005 c
15-1245521182
Kerk
2009-06-20 22:06
2009.08.23
География


15-1245959313
dmk
2009-06-25 23:48
2009.08.23
15 копеек и куча счастья


2-1245739392
Polkin
2009-06-23 10:43
2009.08.23
Вставить готовый текст в RichEdit


1-1211444212
MishaLukash
2008-05-22 12:16
2009.08.23
DBGrid цифровая клавиарура ввод десят.запятой


2-1246014882
berezne
2009-06-26 15:14
2009.08.23
Компиляция exe файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский