none
Вопрос касательно работы IDirect3DSurface9->GetDC(HDC) RRS feed

  • Вопрос

  • 1) Могу ли я скопировать HDC произвольного окна, полученное с помощью GetDC(HWND) в IDirect3DSurface9 используя GetDC(HDC) и BITBLT? Если да, то каким именно образом?
    2) На сколько это будет быстро, по скорости, хотя бы примерно (получится ли брать изображение с 3 окон, каждое из которых имеет размер 1920x1080 и использовать их в качестве текстур в предельно простой сцене, имея при этом 60 фпс)?

Ответы

  • Да, можете, почему бы и нет? Например так:

    	IDirect3DSurface9 *surface = nullptr;
    	device->CreateOffscreenPlainSurface(W, H, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &surface, nullptr);
    
    	IDirect3DSurface9 *buffer = nullptr;
    	device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &buffer);
    
    	HDC targetdc = NULL;
    	surface->GetDC(&targetdc);
    
    	HDC scrdc = GetDC(srcwnd);
    
    	BOOL res = BitBlt(targetdc, 0, 0, W, H, scrdc, 0, 0, SRCCOPY);
    	ReleaseDC(srcwnd, scrdc);
    	surface->ReleaseDC(targetdc);
    
    	device->UpdateSurface(surface, NULL, buffer, NULL);
    	device->Present(NULL, NULL, NULL, NULL);

    где device - указатель на устройство IDirect3DDevice9 *

    srcwnd - окно, которые вы копируете

    W,H - ширина и высота копируемого фрагмента

    изображение 1200х800 копируется за 17-18 мс

    • Помечено в качестве ответа NonStandardCode 4 июня 2020 г. 13:23
    4 июня 2020 г. 10:42