Destinos de representación, dispositivos y recursos
Un destino de renderización es la ubicación donde dibujará el programa. Normalmente, el destino de renderización es una ventana (en concreto, el área cliente de la ventana). También podría ser un mapa de bits en memoria que no se muestra. Un destino de renderización se representa mediante la interfaz ID2D1RenderTarget.
Un dispositivo es una abstracción que representa lo que realmente dibuja los píxeles. Un dispositivo de hardware usa la GPU para que el rendimiento sea más rápido, mientras que un dispositivo de software usa la CPU. La aplicación no crea el dispositivo. En su lugar, el dispositivo se crea implícitamente cuando la aplicación crea el destino de renderización. Cada destino de renderización está asociado a un dispositivo determinado, ya sea hardware o software.
Un recurso es un objeto que el programa usa para dibujar. Estos son algunos ejemplos de recursos definidos en Direct2D:
- Pincel. Controla cómo se pintan las líneas y las regiones. Los tipos de pincel incluyen pinceles de color sólido y pinceles degradados.
- Estilo de trazo. Controla cómo se ve una línea, por ejemplo, si es discontinua o continua.
- Geometría. Representa una colección de líneas y curvas.
- Malla. Forma compuesta de triángulos. La GPU puede consumir los datos de malla directamente, a diferencia de los datos de geometría, que se deben convertir antes de renderizarlos.
Los destinos de renderización también se consideran un tipo de recurso.
Algunos recursos se benefician de la aceleración de hardware. Un recurso de este tipo siempre está asociado a un dispositivo determinado, ya sea hardware (GPU) o software (CPU). Este tipo de recurso se denomina dependiente del dispositivo. Los pinceles y mallas son ejemplos de recursos dependientes del dispositivo. Si el dispositivo deja de estar disponible, el recurso debe volver a crearse para un nuevo dispositivo.
Otros recursos se quedan en la memoria de la CPU, independientemente de qué dispositivo se use. Estos recursos son independientes del dispositivo, ya que no están asociados a un dispositivo determinado. No es necesario volver a crear recursos independientes del dispositivo al cambiar el dispositivo. Los estilos de trazo y las geometrías son recursos independientes del dispositivo.
En la documentación de Windows sobre cada recurso se indica si el recurso es dependiente del dispositivo o independiente del dispositivo. Cada tipo de recurso se representa mediante una interfaz que deriva de ID2D1Resource. Por ejemplo, los pinceles se representan mediante la interfaz ID2D1Brush.
El objeto de fábrica de Direct2D
El primer paso al usar Direct2D es crear una instancia del objeto de fábrica de Direct2D. En programación informática, una fábrica es un objeto que crea otros objetos. La fábrica de Direct2D crea los siguientes tipos de objetos:
- Destinos de renderización.
- Recursos independientes del dispositivo, como estilos de trazo y geometrías.
Los recursos dependientes del dispositivo, como pinceles y mapas de bits, se crean mediante el objeto de destino de renderización.
Para crear el objeto de fábrica de Direct2D, llame a la función D2D1CreateFactory.
ID2D1Factory *pFactory = NULL;
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);
El primer parámetro es una flag que indica las opciones de creación. La flag D2D1_FACTORY_TYPE_SINGLE_THREADED significa que no llamará a Direct2D a través de varios subprocesos. Para admitir llamadas a través de varios subprocesos, indique D2D1_FACTORY_TYPE_MULTI_THREADED. Si el programa usa un único subproceso para llamar a Direct2D, la opción de un solo subproceso es más eficaz.
El segundo parámetro de la función D2D1CreateFactory recibe un puntero a la interfaz ID2D1Factory.
Debe crear el objeto de fábrica de Direct2D antes del primer mensaje WM_PAINT. El controlador de mensajes WM_CREATE es un buen punto de partida para crear la fábrica:
case WM_CREATE:
if (FAILED(D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
{
return -1; // Fail CreateWindowEx.
}
return 0;
Creación de recursos de Direct2D
El programa Circle (Círculo) usa los siguientes recursos dependientes del dispositivo:
- Destino de renderización asociado a la ventana de la aplicación.
- Pincel de color sólido para pintar el círculo.
Cada uno de estos recursos se representa mediante una interfaz COM:
- La interfaz ID2D1HwndRenderTarget representa el destino de renderización.
- La interfaz ID2D1SolidColorBrush representa el pincel.
El programa Circle almacena punteros a estas interfaces como variables miembro de la clase MainWindow
:
ID2D1HwndRenderTarget *pRenderTarget;
ID2D1SolidColorBrush *pBrush;
El código siguiente crea estos dos recursos.
HRESULT MainWindow::CreateGraphicsResources()
{
HRESULT hr = S_OK;
if (pRenderTarget == NULL)
{
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);
hr = pFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&pRenderTarget);
if (SUCCEEDED(hr))
{
const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);
if (SUCCEEDED(hr))
{
CalculateLayout();
}
}
}
return hr;
}
Para crear un destino de renderización para una ventana, llame al método ID2D1Factory::CreateHwndRenderTarget en la fábrica de Direct2D.
- El primer parámetro indica las opciones que son comunes a cualquier tipo de destino de renderización. Aquí, pasamos las opciones predeterminadas llamando a la función auxiliar D2D1::RenderTargetProperties.
- El segundo parámetro indica el identificador de la ventana más el tamaño del destino de renderización, en píxeles.
- El tercer parámetro recibe un puntero ID2D1HwndRenderTarget.
Para crear el pincel de color sólido, llame al método ID2D1RenderTarget::CreateSolidColorBrush en el destino de renderización. El color se da como un valor D2D1_COLOR_F. Para obtener más información sobre los colores en Direct2D, consulte Usar colores en Direct2D.
Además, observe que si el destino de renderización ya existe, el método CreateGraphicsResources
devuelve S_OK sin hacer nada. El motivo de este diseño quedará claro en el tema siguiente.
Siguientes