APIs gráficas no Windows
O Windows Vista inclui suporte para um modelo de driver de vídeo totalmente novo que representa uma grande revisão no design dos drivers de vídeo desde a introdução do Windows Driver Model (WDM) para o Windows 98. Esse modelo redesenhado reflete a evolução do hardware de vídeo do mundo das operações de varredura 2D e dos aplicativos GDI para o mundo dos jogos 3D com hardware gráfico de função fixa e, finalmente, para o mundo da moderna unidade de processamento gráfico programável (GPU) que suporta uma ampla gama de aplicativos gráficos de alto desempenho. O Windows 7 e o Windows 8 se baseiam na infraestrutura gráfica do Windows Vista, fornecendo recursos gráficos e APIs adicionais. Este artigo aborda os recursos gráficos e as APIs do Windows.
- Background
- Direct3D 9
- Direct3D 9Ex
- Direct3D 10
- Direct3D 10.1
- Direct3D 11
- Direct3D 11.1
- OpenGL
- Compatibilidade de aplicativos, GDI e versões mais antigas do Direct3D
- Recomendações
Tela de fundo
A principal API para programação de gráficos desde os primórdios do Windows é o GDI (Graphical Device Interface). Essa API foi projetada para lidar com vários dispositivos de saída 2D e formou a base para a experiência da interface do usuário do Windows. O DirectDraw e o Direct3D foram introduzidos como APIs alternativas para oferecer suporte a jogos em tela inteira e renderização 3D como extensões do hardware existente da época. As interações com o GDI eram complicadas. A mistura eficaz de elementos GDI tradicionais com elementos Direct3D foi limitada por esse design. A versão do Windows XP do WDM, conhecida como XPDM, reflete a natureza lado a lado do GDI e do Direct3D (consulte a Figura 1).
Figura 1. APIs gráficas no Windows XP
Ao longo dos anos, o poder das placas de vídeo 3D cresceu muito, a ponto de a grande maioria do hardware ser dedicada a essa função. Um novo modelo de driver, o Windows Display Driver Model (WDDM), traz a GPU e o Direct3D para o primeiro plano, permitindo a criação de uma experiência totalmente nova, o desktop 3D, que combina perfeitamente o mundo 2D do GDI com o poder dos modernos GPUs programáveis. Com o WDDM, o hardware de vídeo é controlado inteiramente pelo Direct3D e todas as outras interfaces gráficas se comunicam com o hardware de vídeo por meio do novo modelo de driver centrado no Direct3D (consulte a Figura 2).
Figura 2. APIs gráficas no Windows Vista
Para obter mais informações sobre o WDDM, consulte Guia de design do modelo de driver de vídeo do Windows Vista (WDDM).
Direct3D 9
A versão 9 do DirectX foi lançada pela primeira vez para o Windows em 2002, com atualizações subsequentes em 2003 e 2004. Essa API representa uma década de evolução das tecnologias DirectX, a introdução de modelos de programação de sombreadores mais poderosos para Direct3D e uma maturidade respaldada por milhares de títulos lançados. O Direct3D 9 é a principal interface gráfica no Windows Vista. Ele continua sendo a API ideal para escrever jogos e aplicativos 3D que precisam ser executados em uma ampla variedade de versões existentes de hardware e Windows. Os detalhes do novo modelo de driver estão ocultos para os aplicativos que usam as interfaces do Direct3D 9, mas, nos bastidores, o sistema operacional está aproveitando ao máximo os novos recursos para oferecer multitarefa real da GPU, gerenciamento de recursos mais eficiente e desempenho robusto.
Para garantir a compatibilidade total com versões mais antigas do Windows, algumas peculiaridades do modelo de driver antigo devem ser emuladas mesmo no novo modelo de driver de vídeo do Windows Vista. Por exemplo, quando um aplicativo de tela inteira perde o foco, ele deve presumir que perdeu todos os recursos da memória de vídeo (VRAM) e recarregar os que criou como recursos não gerenciados, embora o novo modelo de driver manipule os recursos de forma transparente, sem retirá-los do contexto do dispositivo. Até mesmo o conceito de um tipo de recurso gerenciado versus o padrão é específico do antigo modelo de driver. Outro exemplo é a expectativa de falha ao alocar recursos não gerenciados (pool padrão) que excedem a quantidade de VRAM disponível, embora o novo modelo de driver possa fornecer uma quantidade quase ilimitada de memória de vídeo virtual. Devido a esses requisitos, os aplicativos Direct3D em execução no Windows Vista ainda receberão essas condições de erro. Portanto, eles estão limitados em sua capacidade de usar as interfaces básicas do Direct3D 9 para usar totalmente alguns recursos do novo modelo de driver.
Embora os novos sistemas enviados com o Windows Vista incluam placas de vídeo com drivers WDDM e novos drivers para várias placas de vídeo populares estejam incluídos na caixa, o Windows Vista continua a oferecer suporte à capacidade de usar drivers XPDM mais antigos para atualizações e edições corporativas. Em sistemas que usam o modelo de driver antigo, o Direct3D 9 e as interfaces mais antigas devem ser usados, e a operação do sistema gráfico é muito parecida com a do Windows XP (Figura 1). O WDDM é necessário para que os aplicativos usem Direct3D 9Ex, Direct3D 10 e as versões posteriores.
Direct3D 9Ex
A interface Direct3D 9Ex fornece acesso a uma pequena extensão da API padrão do Direct3D 9 que expõe a alocação virtualizada de recursos, a nova semântica de dispositivo perdido e alguns outros novos recursos disponíveis durante a execução no Windows Vista. Ao criar esse objeto estendido, a API do Direct3D 9 usa a nova semântica e, portanto, exige que o aplicativo use uma lógica diferente (e, portanto, caminhos de código diferentes) para criação, gerenciamento e tratamento de erros de recursos para novos tipos de condições. Essa API só está disponível no Windows Vista e requer drivers WDDM. Como o Direct3D 9Ex usa uma API separada e um caminho de código de driver do Direct3D 9, o suporte a essa API requer casos de teste adicionais para seu aplicativo.
O principal motivo da criação da nova API Direct3D 9Ex foi permitir o acesso total aos novos recursos do WDDM e, ao mesmo tempo, manter a compatibilidade com os aplicativos Direct3D existentes. A nova área de trabalho 3D e muitos aplicativos específicos do Windows Vista usam esta versão do Direct3D 9, mas não são funcionais quando executados em drivers XPDM mais antigos. Uma vez que a API Direct3D 9Ex nunca aparecerá em versões mais antigas do Windows devido à falta de suporte para o WDDM, as interfaces padrão do Direct3D 9 abrangem um conjunto muito mais amplo de sistemas. Para aplicativos de alto desempenho que podem aproveitar a última geração de hardware de vídeo, a versão totalmente nova 10 do Direct3D fornece vários novos recursos não expostos pelo Direct3D 9Ex. Como resultado, para jogos e a maioria dos outros aplicativos, o Direct3D 9 ou o Direct3D 10 é a API recomendada.
Observação
O SDK do DirectX não fornece exemplos, cabeçalhos ou bibliotecas para a interface do Direct3D 9Ex. Para obter mais informações sobre o Direct3D 9Ex, consulte DirectX para o Windows Vista.
Direct3D 10
Para aproveitar totalmente o potencial do novo modelo de driver do Windows Vista e do hardware de última geração, foi criada uma versão totalmente nova da API do Direct3D. Embora o WDDM elimine algumas das limitações de desempenho do sistema gráfico existente, o Direct3D 10 vai além e remove os gargalos de design da API Direct3D existente, o que simplifica bastante a tarefa de programar a GPU.
A nova API elimina completamente todos os aspectos de função fixa, com exceção de alguns, substituindo-os por construções programáveis, o que simplifica bastante a implementação interna. As centenas de bits de recursos das versões anteriores do Direct3D foram completamente eliminadas e substituídas por um conjunto de funcionalidades bem definido e inclusivo, com apenas alguns cenários de uso opcionais para formatos de recursos específicos. A criação e validação de recursos com uso intensivo de CPU agora têm uma semântica explícita na nova API. Isso permite um comportamento de desempenho muito mais previsível e reduz bastante a sobrecarga por extração. Os recursos podem ser reconfigurados em várias formas para permitir o uso eficiente em vários estágios, e o conjunto de recursos impõe bem menos restrições aos cenários de uso de formatos. Há também novos formatos de textura de mapa normal compactados por bloco.
Na nova API, as constantes do sombreador e o estado do dispositivo são recursos explícitos, permitindo um cache muito mais eficiente no hardware e uma validação de driver bem mais simples. O modelo de sombreador programável foi unificado entre os sombreadores de vértice e pixel, tornando-se mais expressivo com um modelo computacional bem definido e um conjunto de operadores. Além disso, um novo estágio de sombreador de geometria foi adicionado para operar em primitivos após o estágio do sombreador de vértice. Os resultados do trabalho da GPU nos estágios de sombreador de vértice e geometria do pipeline podem ser transmitidos para a RAM de vídeo para serem reutilados, o que permite a possibilidade de operações de GPU de várias passagens extremamente complexas com uma interação mínima da CPU.
Todos esses aprimoramentos permitem a tecnologia gráfica de última geração e expandem a capacidade dos aplicativos de descarregar o trabalho para a GPU. O descarregamento permite skinning de caracteres baseados em GPU de forma mais complexa, técnicas de morphing acelerado, geração e extrusão de volume de sombra, sistemas de partículas e física totalmente baseados em GPU, materiais mais complexos combinados em lotes eficientes de grande porte, detalhamento processual, mapeamento de deslocamento com ray tracing em tempo real, geração de mapa de cubo de passagem única e várias outras técnicas. Tudo isso é feito enquanto recursos são liberados da CPU para aplicativos mais complexos.
Para fornecer esse nível de inovação no Direct3D 10, o hardware antigo não pode ser expresso como uma implementação parcial de uma nova interface. Uma placa de vídeo é capaz de suportar todos os novos recursos ou não é uma placa compatível com Direct3D 10. Portanto, enquanto o Direct3D 9 pode conduzir o hardware da era DirectX7 com muitos bits de capacidade ausentes e limitações de uso, o Direct3D 10 só funciona em uma nova geração de placas de vídeo. Para que um aplicativo ofereça suporte a um hardware de vídeo mais antigo, ele também deve oferecer suporte às interfaces do Direct3D 9. As versões futuras do Direct3D se basearão na versão 10, ampliando-a para novas versões da API e, ao mesmo tempo, garantindo um superconjunto estrito da funcionalidade do Direct3D 10.
Para obter mais informações sobre o Direct3D 10, consulte Direct3D 10.
Direct3D 10.1
O Windows Vista Service Pack 1 estende a API do Direct3D 10 com o Direct3D 10.1, que adiciona interfaces opcionais e um modelo de sombreador adicional para oferecer suporte a novos recursos de hardware de placas de vídeo que oferecem suporte ao Direct3D 10.1. Todo o hardware capaz de oferecer suporte ao Direct3D 10.1 também oferece suporte total a todos os recursos do Direct3D 10, e os desenvolvedores de jogos podem usar os recursos adicionais do Direct3D 10.1, quando estão disponíveis.
Observação
O Direct3D 10.1 é a API gráfica usada pela área de trabalho do Windows 7.
Observação
Windows 7 e a atualização do Windows Vista adicionam suporte para DXGI 1.1, níveis de recursos 10level9 e o dispositivo WARP10 à API existente do Direct3D 10.1.
Direct3D 11
O Windows 7 oferece suporte a uma nova revisão do Direct3D e o Direct3D 11, criado com base no design da API do Direct3D 10.1. Os novos recursos da API incluem renderização multithread e criação de recursos, sombreador de computação, suporte para níveis de recursos 10level9 e o dispositivo de renderização de software WARP10, além de novos recursos de hardware da classe Direct3D 11, como mosaico com uso de sombreadores de envoltório e domínio, formatos de compressão de textura BC6H e BC7, Shader Model 5.0 e Dynamic Shader Linkage. A nova API pode usar placas de vídeo de classe Direct3D 10 e 10.1 existentes, algumas placas Direct3D 9 por meio dos níveis de recursos 10level9 com suporte limitado a recursos e as placas de vídeo de classe Direct3D 11 de última geração.
Além da API do Direct3D 11, o Windows 7 inclui DXGI 1.1, Direct2D, DirectWrite e suporte para drivers WDDM 1.1.
Observação
O Direct3D 11 e as APIs relacionadas também estão disponíveis como uma atualização para o Windows Vista (consulte Como instalar a versão mais recente do DirectX).
Direct3D 11.1
O Windows 8 estende a API do Direct3D 11 com o Direct3D 11.1. O Direct3D 11.1 oferece suporte a todos os hardwares existentes que apresentam os níveis de recursos 11, 10_x e 9_x, bem como um novo nível de recurso 11_1.
Além da API do Direct3D 11.1, o Windows 8 inclui contextos de dispositivo DXGI 1.2, Direct2D e suporte para drivers WDDM 1.2.
Observação
Se você quiser que seus aplicativos da Windows Store programem elementos gráficos 3D com DirectX, poderá usar a API do Direct3D 11.1. Para obter mais informações sobre a programação de elementos gráficos 3D com DirectX, consulte Introdução aos elementos gráficos 3D com o DirectX.
Atualização de plataforma para Windows 7: o suporte parcial está disponível para a API do Direct3D 11.1 no Windows 7 ou Windows Server 2008 R2 com a Atualização de plataforma para Windows 7 instalada. Para obter mais informações sobre a atualização da plataforma para o Windows 7, consulte Atualização de plataforma para Windows 7.
OpenGL
O Windows Vista, o Windows 7 e o Windows 8 oferecem o mesmo suporte que o Windows XP para OpenGL, o que permite que os fabricantes de placas de vídeo forneçam um driver de cliente instalável (ICD) para OpenGL que ofereça suporte acelerado por hardware. Observe que as versões mais recentes desses ICDs são necessárias para oferecer total suporte ao Windows Vista, Windows 7 ou Windows 8. Na maioria dos casos, se não houver um ICD instalado, o sistema voltará a usar a camada de software OpenGL v1.1.
Compatibilidade de aplicativos, GDI e versões mais antigas do Direct3D
Os sistemas gráficos do Windows Vista, do Windows 7 e do Windows 8 foram projetados para oferecer suporte a uma ampla gama de cenários de hardware e uso, a fim de habilitar novas tecnologias e, ao mesmo tempo, continuar oferecendo suporte aos sistemas existentes. As interfaces gráficas existentes, como GDI, GDI+ e versões mais antigas do Direct3D, continuam a funcionar no Windows Vista e no Windows 7, mas são remapeadas internamente sempre que possível. Isso significa que a maioria dos aplicativos existentes no Windows continuará funcionando.
O Windows Vista, o Windows 7 e o Windows 8 continuam a oferecer suporte às mesmas interfaces Direct3D e DirectDraw do Windows XP, desde a versão 3 do DirectX (com exceção do modo retido do Direct3D, que foi removido). Assim como no Windows XP Professional x64 Edition, os aplicativos nativos de 64 bits nas versões mais recentes do Windows estão limitados às interfaces Direct3D9, DirectDraw7 ou mais recentes. Os aplicativos de alto desempenho devem usar o Direct3D 9 ou posterior para garantir que tenham a compatibilidade mais próxima com os recursos de hardware.
Recomendações
Considere as seguintes recomendações ao selecionar uma API para seu aplicativo gráfico:
- Use o Direct3D 9 se o aplicativo precisar oferecer suporte ao Windows XP ou a uma versão anterior do Windows.
- Use o Direct3D 9 se quiser oferecer suporte ao Windows Vista ou Windows 7 em execução com drivers XPDM. Para sistemas Windows Vista ou Windows 7 que não têm hardware de vídeo Direct3D 10 ou superior, você pode optar por usar o caminho de código existente do Windows XP Direct3D 9 ou usar os níveis de recurso 10level9 por meio da API do Direct3D 10.1 ou Direct3D 11.
- Use o Direct3D 11 para aproveitar a última geração de hardware de vídeo no Windows Vista, Windows 7 e Windows 8. Os aplicativos da Windows Store devem usar o Direct3D 11 ou posterior.