Considerações sobre o Direct3D 9 para o Direct3D 10 (Direct3D 10)
A página a seguir fornece uma estrutura de tópicos básica das principais diferenças entre o Direct3D 9 e o Direct3D 10. A estrutura de tópicos abaixo fornece algumas informações para ajudar os desenvolvedores com experiência em Direct3D 9 a explorar e se relacionar com o Direct3D 10.
Embora as informações neste tópico comparem o Direct3D 9 com o Direct3D 10, como o Direct3D 11 se baseia nas melhorias feitas no Direct3D 10 e 10.1, você também precisa dessas informações para migrar do Direct3D 9 para o Direct3D 11. Para obter informações sobre como ir além do Direct3D 10 para o Direct3D 11, consulte Migrando para o Direct3D 11.
- Visão geral das principais alterações estruturais no Direct3D 10
- Abstrações / Separação do Motor
- Truques para resolver rapidamente problemas de compilação de aplicativos
- Conduzindo a API do Direct3D 10
- Criação de recursos
- Exibições
- Acesso estático versus dinâmico a recursos
- Efeitos do Direct3D 10
- HLSL sem efeitos
- Compilação de sombreamento
- Criação de recursos de sombreador
- Interface da camada de reflexão do sombreador
- Layouts do Assembler de Entrada - Sombreador de vértice/Vinculação de fluxo de entrada
- Impacto da remoção do código morto do sombreador
- Exemplo de estrutura de entrada do sombreador de vértice
- Criação de objeto de estado
- Portabilidade de texturas
- Portabilidade de sombreadores
- Diferenças adicionais do Direct3D 10 a serem observadas
- Diferenças adicionais do Direct3D 10.1
- Tópicos relacionados
Visão geral das principais alterações estruturais no Direct3D 10
O processo de renderização usando o dispositivo Direct3D 10 é estruturalmente semelhante ao Direct3D 9.
- Definir uma origem de fluxo de vértice
- Definir layout de entrada no Direct3D 10 (definir declaração de fluxo de vértice no Direct3D 9)
- Declarar topologia primitiva
- Definir texturas
- Definir objetos de estado
- Definir sombreadores
- Draw
A chamada Draw une as operações; a ordem das chamadas antes da chamada Draw é arbitrária. As principais diferenças no design da API do Direct3D 10 são as seguintes:
- Remoção da função fixa
- Remoção de bits CAPS – o conjunto de recursos base do Direct3D 10 é garantido
- Gerenciamento mais rigoroso de: acesso a recursos, estado do dispositivo, constantes de sombreador, vinculação de sombreador (entradas e saídas para sombreadores) entre estágios
- As alterações no nome do ponto de entrada da API refletem o uso da memória virtual da GPU (Map() em vez de Lock()).
- Uma camada de depuração pode ser adicionada ao dispositivo no momento da criação
- A topologia primitiva agora é um estado explícito (separado da chamada Draw)
- Constantes de sombreador explícitas agora são armazenadas em buffers constantes
- A criação de sombreador é feita inteiramente em HLSL. O compilador HLSL agora reside na DLL primária do Direct3D 10.
- Novo estágio programável - o sombreador de geometria
- Remoção de BeginScene()/EndScene()
- Funcionalidade comum de gerenciamento de 2D, foco e adaptador implementada em um novo componente: DXGI
Remoção da função fixa
Às vezes, é surpreendente que, mesmo em um mecanismo Direct3D 9 que explora totalmente o pipeline programável, ainda haja várias áreas que dependem do pipeline FF (função fixa). As áreas mais comuns geralmente estão relacionadas à renderização alinhada ao espaço da tela para a interface do usuário. É por esse motivo que é provável que você precise criar um sombreador de emulação FF ou um conjunto de sombreadores que forneçam os comportamentos de substituição necessários.
Esta documentação contém um white paper contendo fontes de sombreador de substituição para os comportamentos FF mais comuns (consulte Exemplo de EMU de função fixa). Alguns comportamentos de pixel de função fixa, incluindo teste alfa, foram movidos para sombreadores.
Validação de tempo de criação de objeto de dispositivo
O pipeline do Direct3D 10 foi reprojetado desde o início em hardware e software com a intenção principal de reduzir a sobrecarga da CPU (no momento do desenho). Para reduzir custos, todos os tipos de dados do dispositivo foram atribuídos a um objeto com métodos de criação explícitos fornecidos pelo próprio dispositivo. Isso permite a validação estrita de dados no momento da criação do objeto, em vez de durante a chamada do Draw, como geralmente acontece com o Direct3D 9.
Abstrações / Separação do Motor
Aplicativos, incluindo jogos, que desejam dar suporte ao Direct3D 9 e ao Direct3D 10 precisam ter as camadas de renderização abstraídas do restante da base de código. Há muitas maneiras de conseguir isso, mas a chave para todas elas é o design da camada de abstração para o dispositivo Direct3D de nível inferior. Todos os sistemas devem se comunicar com o hardware por meio da camada comum, projetada para fornecer recursos de GPU e gerenciamento de tipo de baixo nível.
Remoção direta de dependências do Direct3D 9
Ao portar bases de código grandes e testadas anteriormente, é importante minimizar a quantidade de alterações de código para aquelas que são absolutamente necessárias para preservar comportamentos testados anteriormente no código. As práticas recomendadas incluem documentar claramente onde os itens mudam usando comentários. Muitas vezes, é útil ter um padrão de comentários para esse trabalho que permita uma navegação rápida pela base de código.
A seguir está um exemplo de lista de comentários padrão de linha única / bloco inicial que podem ser usados para este trabalho.
Item | Descrição |
---|---|
Direct3D 10 REMOVIDO |
Use isso onde as linhas / blocos de código são removidos |
O Direct3D 10 PRECISA DE ATUALIZAÇÃO |
Ajuda a adicionar notas adicionais ao comentário NEED UPDATE que sugere qual trabalho / nova API deve ser usada para visitas posteriores ao código para conversão de comportamento. O uso intenso de assert(false) também deve ser usado onde \\ Direct3D 10 NEEDS UPDATE ocorre para garantir que você não execute código errôneo sem saber |
Direct3D 10 ALTERADO |
As áreas onde ocorreram grandes mudanças devem ser mantidas para referência futura, mas comentadas |
Direct3D 10 FIM |
Qualificador de bloco de código final |
Para várias linhas de origem, você deve usar os comentários do estilo C /* */ também, mas adicione os comentários iniciais / finais relevantes em torno dessas áreas.
Truques para resolver rapidamente problemas de compilação de aplicativos
Substituindo tipos do Direct3D 9
Pode ser útil inserir um arquivo de cabeçalho de alto nível contendo definições/substituições de tipo para tipos base do Direct3D 9 que não têm mais suporte nos cabeçalhos do Direct3D 10. Isso ajudará você a minimizar a quantidade de alterações no código e nas interfaces em que há um mapeamento direto de um tipo Direct3D 9 para o tipo Direct3D 10 recém-definido. Essa abordagem também é útil para manter os comportamentos de código juntos em um arquivo de origem. Nesse caso, é uma boa ideia definir tipos de versão neutra/geralmente nomeados que descrevem constructos comuns usados para renderização, mas abrangem as APIs do Direct3D 9 e do Direct3D 10. Por exemplo:
#if defined(D3D9)
typedef IDirect3DIndexBuffer9 IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9 IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer IDirect3DIndexBuffer;
typedef ID3D10Buffer IDirect3DVertexBuffer
#endif
Outros exemplos específicos do Direct3D 10 incluem:
typedef ID3D10TextureCube IDirect3DCubeTexture;
typedef ID3D10Texture3D IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT D3DVIEWPORT;
typedef ID3D10VertexShader IDirect3DVertexShader;
typedef ID3D10PixelShader IDirect3DPixelShader;
Resolvendo problemas de link
É aconselhável desenvolver aplicativos Direct3D 10 e Windows Vista usando a versão mais recente do Microsoft Visual Studio. No entanto, é possível criar um aplicativo do Windows Vista que depende do Direct3D 10 usando a versão anterior de 2003 do Visual Studio. O Direct3D 10 é um componente da plataforma Windows Vista que tem dependências (como no SDK da plataforma Server 2003 SP1) na seguinte biblioteca: BufferOverflowU.lib é necessário para resolver qualquer problema de vinculador de verificação de buffer_security.
Simulando CAPs de dispositivos
Muitos aplicativos contêm áreas de código que dependem da disponibilidade de dados CAPS do dispositivo. Contorne isso substituindo a enumeração do dispositivo e forçando o CAPS do dispositivo a valores sensatos. Planeje visitar novamente as áreas onde há dependências do CAPS posteriormente para remoção total do CAPS sempre que possível.
Conduzindo a API do Direct3D 10
Esta seção se concentra nas alterações de comportamento causadas pela API do Direct3D 10.
- Criação de recursos
- Exibições
- Acesso estático versus dinâmico a recursos
- Efeitos do Direct3D 10
- HLSL sem efeitos
- Compilação de sombreamento
- Criação de recursos de sombreador
- Interface da camada de reflexão do sombreador
- Layouts do Assembler de Entrada - Sombreador de vértice/Vinculação de fluxo de entrada
- Impacto da remoção do código morto do sombreador
- Exemplo de estrutura de entrada do sombreador de vértice
- Criação de objeto de estado
Criação de recursos
A API do Direct3D 10 projetou recursos como tipos de buffer genéricos que têm sinalizadores de associação específicos de acordo com o uso planejado. Esse ponto de design foi escolhido para facilitar o acesso quase onipresente de recursos no Pipeline para cenários como renderização em um buffer de vértice e, em seguida, desenhar instantaneamente os resultados sem interromper a CPU. O exemplo a seguir demonstra a alocação de buffers de vértice e buffer de índice em que você pode ver que a descrição do recurso difere apenas pelos sinalizadores de associação de recursos da GPU.
A API do Direct3D 10 forneceu métodos auxiliares de textura para criar explicitamente recursos de tipo de textura, mas, como você pode imaginar, essas são realmente funções auxiliares.
- CreateTexture2D()
- CreateTextureCube()
- CreateTexture3D()
Ao direcionar o Direct3D 10, é provável que você queira alocar mais itens durante o tempo de criação do recurso do que está acostumado com o Direct3D 9. Isso se tornará mais aparente com a criação de buffers e texturas de destino de renderização, onde você também precisa criar uma exibição para acessar o buffer e definir o recurso no dispositivo.
Tutorial 1: Noções básicas do Direct3D 10
Observação
O Direct3D 10 e versões posteriores do Direct3D estendem o formato de arquivo DDS para dar suporte a novos formatos DXGI, matrizes de textura e matrizes de mapa de cubo. Para obter mais informações sobre a extensão de formato de arquivo DDS, consulte o Guia de Programação para DDS.
Exibições
Uma exibição é uma interface especificamente tipada para dados armazenados em um buffer de pixels. Um recurso pode ter várias exibições alocadas de uma só vez e esse recurso é realçado no exemplo de Renderização de Passagem Única para Mapa de Cubo contido neste SDK.
Página do Guia do Programador sobre Acesso a Recursos
Acesso estático versus dinâmico a recursos
Para obter o melhor desempenho, os aplicativos devem particionar seu uso de dados em termos da natureza estática versus dinâmica dos dados. O Direct3D 10 foi projetado para aproveitar essa abordagem e, como tal, as regras de acesso aos recursos foram significativamente reforçadas em relação ao Direct3D 9. Para recursos estáticos, o ideal é preencher o recurso com seus dados durante o tempo de criação. Se o mecanismo tiver sido projetado em torno do ponto de design Criar, Bloquear, Preencher, Desbloquear do Direct3D 9, você poderá adiar a população da hora de criação usando um recurso de preparo e o método UpdateSubResource na interface do recurso.
Efeitos do Direct3D 10
O uso do sistema Direct3D 10 Effects está fora do escopo deste artigo. O sistema foi escrito para aproveitar ao máximo os benefícios arquitetônicos que o Direct3D 10 oferece. Consulte a seção Efeitos (Direct3D 10) para obter mais detalhes sobre seu uso.
HLSL sem efeitos
O pipeline do Sombreador do Direct3D 10 pode ser controlado sem o uso do sistema de efeitos do Direct3D 10. Observe que, nesse caso, todo o buffer constante, sombreador, sampler e associação de textura devem ser gerenciados pelo próprio aplicativo. Consulte o link de exemplo e as seções a seguir deste documento para obter mais detalhes:
Compilação de sombreamento
O compilador HLSL do Direct3D 10 traz aprimoramentos para a definição da linguagem HLSL e, portanto, tem a capacidade de operar em 2 modos. Para obter suporte completo de funções intrínsecas e semânticas de estilo Direct3D 9, a compilação deve ser invocada usando o sinalizador COMPATIBILITY MODE, que pode ser especificado por compilação.
A semântica de linguagem HLSL específica do modelo de sombreador 4.0 e as funções intrínsecas para Direct3D 10 podem ser encontradas em HLSL. As principais alterações na sintaxe do HLSL do Direct3D 9 para prestar mais atenção estão na área de acesso à textura. A nova sintaxe é a única forma com suporte do compilador fora do modo de compatibilidade.
Observação
As APIs do tipo compilador Direct3D 10 (D3D10CompileShader e D3D10CompileEffectFromMemory) são fornecidas pelos runtimes do Direct3D 10, 10.1 e 11 executados no Windows Vista e posterior. As APIs do tipo compilador Direct3D 10 têm a mesma funcionalidade que o compilador HLSL fornecido no SDK do DirectX (dezembro de 2006). Esse compilador HLSL não dá suporte aos perfis do Direct3D 10.1 (vs_4_1, ps_4_1, gs_4_1, fx_4_1) e não tem várias otimizações e melhorias. Você pode obter um compilador HLSL que dá suporte aos perfis do Direct3D 10.1 da versão herdada mais recente do SDK do DirectX. Para obter informações sobre o SDK do DirectX herdado, consulte Onde está o SDK do DirectX?. Você pode obter o compilador de linha de comando HLSL Fxc.exe mais recente e as APIs D3DCompiler do SDK do Windows.
Criação de recursos de sombreador
A criação de instâncias de sombreador compiladas fora do sistema de efeitos do Direct3D 10 é feita de maneira muito semelhante ao Direct3D 9, no entanto, no Direct3D 10, é importante manter a assinatura de entrada do sombreador para uso posterior. A assinatura é retornada por padrão como parte do blob do sombreador, mas pode ser extraída para reduzir os requisitos de memória, se necessário. Para obter mais detalhes, consulte Usando sombreadores no Direct3D 10.
Interface da camada de reflexão do sombreador
A camada de reflexão do sombreador é a interface pela qual as informações sobre os requisitos do sombreador podem ser obtidas. Isso é particularmente útil ao criar vínculos de assembly de entrada (veja abaixo) em que talvez seja necessário percorrer os requisitos de entrada do sombreador para garantir que você esteja fornecendo a estrutura de entrada correta para o sombreador. Você pode criar uma instância da interface da camada de reflexão ao mesmo tempo em que cria uma instância de um sombreador compilado.
A camada de reflexão do sombreador substitui os métodos D3DX9 que fornecem funcionalidade semelhante. Por exemplo, IsParameterUsed é substituído pelo método GetDesc.
Layouts do Assembler de Entrada - Sombreador de vértice/Vinculação de fluxo de entrada
O IA (Assembler de Entrada) substitui a Declaração de Fluxo de Vértice do estilo Direct3D 9 e sua estrutura de descrição é muito semelhante na forma. A principal diferença que a IA traz é que o objeto de layout IA criado deve ser mapeado diretamente para um formato específico de assinatura de entrada do sombreador. O objeto de mapeamento criado para vincular o fluxo de entrada ao sombreador pode ser usado em qualquer número de sombreadores em que a assinatura de entrada do sombreador corresponda à do sombreador usado para criar o Layout de Entrada.
Para melhor conduzir o pipeline com dados estáticos, você deve considerar as permutações do formato de fluxo de entrada para possíveis assinaturas de entrada do sombreador e criar as instâncias de objeto de layout de IA o mais cedo possível e reutilizá-las sempre que possível.
Impacto da remoção do código morto do sombreador
A seção a seguir detalha uma diferença significativa entre o Direct3D 9 e o Direct3D 10 que provavelmente exigirá um tratamento cuidadoso no código do mecanismo. Os sombreadores que contêm expressões condicionais geralmente têm determinados caminhos de código removidos como parte do processo de compilação. No Direct3D 9, dois tipos de entradas podem ser removidos (marcados para remoção) quando não utilizados: entradas de assinatura (como o exemplo abaixo) e entradas constantes. Se o final do buffer constante contiver entradas não utilizadas, a declaração de tamanho no sombreador refletirá o tamanho do buffer constante sem as entradas não utilizadas no final. Ambos os tipos de entradas permanecem em assinaturas ou buffers constantes Direct3D 10 com uma exceção especial no caso de entradas constantes não utilizadas no final de um buffer constante. Isso pode ter um impacto no mecanismo ao lidar com sombreadores grandes e criar layouts de entrada. Os elementos que são removidos por otimizações de código morto no compilador ainda devem ser declarados na estrutura de entrada. O exemplo a seguir demonstra este:
Exemplo de estrutura de entrada do sombreador de vértice
struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};
* A remoção do código morto do Direct3D 9 removeria a declaração no sombreador devido à remoção condicional do código morto
float4x4 g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant
VS_INPUT main(VS_INPUT i)
{
VS_INPUT o;
o.pos = mul( i.pos, g_WorldViewProjMtx);
o.uv1 = i.uv1;
if ( g_bLightMapped )
{
o.uv2 = i.uv2;
}
return o;
}
Ou você pode tornar ainda mais óbvio que a constante é uma constante de tempo de compilação com a seguinte declaração:
#define LIGHT_MAPPED false
No exemplo acima, no Direct3D 9, o elemento uv2 seria removido devido a otimizações de código morto no compilador. No Direct3D 10, o código morto ainda será removido, mas o layout do assembler de entrada do sombreador requer a definição dos dados de entrada para existir. A camada de reflexão do sombreador fornece os meios para lidar com essa situação de uma maneira genérica, por meio da qual você pode percorrer os requisitos de entrada do sombreador e garantir que você forneça uma descrição completa do Fluxo de Entrada para o mapeamento de assinatura do sombreador.
Aqui está um exemplo de função para detectar a existência de um nome/índice semântico em uma assinatura de função:
// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
D3D10_SHADER_DESC shaderDesc;
D3D10_SIGNATURE_PARAMETER_DESC paramDesc;
Assert(pReflector);
Assert(SemanticName);
pReflector->GetDesc(&shaderDesc);
for (UINT k=0; k<shaderDesc.InputParameters; k++)
{
pReflector->GetInputParameterDesc( k, ¶mDesc);
if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex)
return true;
}
return false;
}
Criação de objeto de estado
Ao portar o código do mecanismo, pode ser útil usar inicialmente um conjunto padrão de objetos de estado e desabilitar todas as configurações de estado de renderização/estado de textura do dispositivo Direct3D 9. Isso causará artefatos de renderização, mas é a maneira mais rápida de colocar as coisas em funcionamento. Posteriormente, você pode construir um sistema de gerenciamento de objetos de estado que pode usar uma chave composta para permitir a reutilização máxima do número de objetos de estado que estão sendo usados.
Portabilidade de texturas
Formatos de arquivo suportados
As funções D3DXxxCreateXXX e D3DXxxSaveXXX que criam ou salvam uma textura de ou para um arquivo gráfico (por exemplo, D3DX10CreateTextureFromFile) dão suporte a um conjunto diferente de formatos de arquivo no Direct3D 10 do que no Direct3D 9:
Formato de arquivo | Direct3D 9 | Direct3D 10 |
---|---|---|
.bmp | sim | sim |
.jpg | sim | sim |
.tga | sim | |
.png | sim | sim |
.dds | sim | sim |
.Ppm | sim | |
.Dib | sim | |
.Hdr | sim | |
.pfm | sim | |
.tiff | sim | |
.gif | sim | |
.tif | sim |
Para obter detalhes, compare as enumerações de D3DXIMAGE_FILEFORMAT do Direct3D 9 com as enumerações D3DX10_IMAGE_FILE_FORMAT do Direct3D 10.
Observação
A biblioteca de utilitários D3DX (D3DX 9, D3DX 10 e D3DX 11) foi preterida para Windows 8. Para processamento de arquivos de textura, recomendamos que você use DirectXTex.
Mapeando formatos de textura
A tabela a seguir mostra o mapeamento de formatos de textura do Direct3D 9 para o Direct3D 10. Qualquer conteúdo em formatos não disponíveis no DXGI precisará ser convertido por rotinas de utilitário.
Formato Direct3D 9 | Formato Direct3D 10 |
---|---|
D3DFMT_UNKNOWN | DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 | Não disponível |
D3DFMT_A8R8G8B8 | DXGI_FORMAT_B8G8R8A8_UNORM & DXGI_FORMAT_B8G8R8A8_UNORM_SRGB¹ |
D3DFMT_X8R8G8B8 | DXGI_FORMAT_B8G8R8X8_UNORM & DXGI_FORMAT_B8G8R8X8_UNORM_SRGB¹ |
D3DFMT_R5G6B5 | DXGI_FORMAT_B5G6R5_UNORM² |
D3DFMT_X1R5G5B5 | Não disponível |
D3DFMT_A1R5G5B5 | DXGI_FORMAT_B5G5R5A1_UNORM² |
D3DFMT_A4R4G4B4 | DXGI_FORMAT_B4G4R4A4_UNORM³ |
D3DFMT_R3G3B2 | Não disponível |
D3DFMT_A8 | DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 | Não disponível |
D3DFMT_X4R4G4B4 | Não disponível |
D3DFMT_A2B10G10R10 | DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 | DXGI_FORMAT_R8G8B8A8_UNORM & DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 | Não disponível |
D3DFMT_G16R16 | DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 | Não disponível |
D3DFMT_A16B16G16R16 | DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 | Não disponível |
D3DFMT_P8 | Não disponível |
D3DFMT_L8 | DXGI_FORMAT_R8_UNORM Observação: use .r swizzle no sombreador para duplicar o vermelho para outros componentes para obter o comportamento D3D9. |
D3DFMT_A8L8 | DXGI_FORMAT_R8G8_UNORM Observação: use swizzle .rrrg no sombreador para duplicar o vermelho e mover o verde para os componentes alfa para obter o comportamento D3D9. |
D3DFMT_A4L4 | Não disponível |
D3DFMT_V8U8 | DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 | Não disponível |
D3DFMT_X8L8V8U8 | Não disponível |
D3DFMT_Q8W8V8U8 | DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 | DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 | Não disponível |
D3DFMT_A2W10V10U10 | Não disponível |
D3DFMT_UYVY | Não disponível |
D3DFMT_R8G8_B8G8 | DXGI_FORMAT_G8R8_G8B8_UNORM (no DX9, os dados foram dimensionados em 255.0f, mas isso pode ser tratado no código do sombreador). |
D3DFMT_YUY2 | Não disponível |
D3DFMT_G8R8_G8B8 | DXGI_FORMAT_R8G8_B8G8_UNORM (no DX9, os dados foram dimensionados em 255.0f, mas isso pode ser tratado no código do sombreador). |
D3DFMT_DXT1 | DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 | DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB Nota: DXT1 e DXT2 são os mesmos do ponto de vista da API/hardware... A única diferença era o 'alfa pré-multiplicado', que pode ser rastreado por um aplicativo e não precisa de um formato separado. |
D3DFMT_DXT3 | DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 | DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB Nota: DXT3 e DXT4 são os mesmos do ponto de vista da API/hardware... A única diferença era o 'alfa pré-multiplicado', que pode ser rastreado por um aplicativo e não precisa de um formato separado. |
D3DFMT_DXT5 | DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE | DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 | Não disponível |
D3DFMT_D15S1 | Não disponível |
D3DFMT_D24S8 | Não disponível |
D3DFMT_D24X8 | Não disponível |
D3DFMT_D24X4S4 | Não disponível |
D3DFMT_D16 | DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE | DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 | Não disponível |
D3DFMT_S1D15 | Não disponível |
D3DFMT_S8D24 | DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 | Não disponível |
D3DFMT_X4S4D24 | Não disponível |
D3DFMT_L16 | DXGI_FORMAT_R16_UNORM Observação: use .r swizzle no sombreador para duplicar o vermelho para outros componentes para obter o comportamento D3D9. |
D3DFMT_INDEX16 | DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 | DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 | DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 | Não disponível |
D3DFMT_R16F | DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F | DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F | DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F | DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F | DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F | DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 | Não disponível |
D3DDECLTYPE_FLOAT1 | DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 | DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 | DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 | DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR | Não disponível |
D3DDECLTYPE_UBYTE4 | DXGI_FORMAT_R8G8B8A8_UINT Observação: o sombreador obtém valores UINT, mas se forem necessários floats integrais de estilo Direct3D 9 (0.0f, 1.0f... 255.f), UINT pode ser convertido em float32 no shader. |
D3DDECLTYPE_SHORT2 | DXGI_FORMAT_R16G16_SINT Observação: o sombreador obtém valores SINT, mas se os floats integrais de estilo Direct3D 9 forem necessários, o SINT poderá ser convertido em float32 no sombreador. |
D3DDECLTYPE_SHORT4 | DXGI_FORMAT_R16G16B16A16_SINT Observação: o sombreador obtém valores SINT, mas se floats integrais de estilo Direct3D 9 forem necessários, SINT poderá ser convertido em float32 no sombreador. |
D3DDECLTYPE_UBYTE4N | DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N | DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N | DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N | DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N | DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 | Não disponível |
D3DDECLTYPE_DEC3N | Não disponível |
D3DDECLTYPE_FLOAT16_2 | DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 | DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' | DXGI_FORMAT_BC4_UNORM |
FourCC 'ATI2' | DXGI_FORMAT_BC5_UNORM |
¹DXGI 1.1, que está incluído no runtime do Direct3D 11, inclui formatos BGRA. No entanto, o suporte para esses formatos é opcional para dispositivos Direct3D 10 e 10.1 com drivers implementados no WDDM (Windows Display Driver Model) para Windows Vista (WDDM 1.0). Em vez disso, considere usar DXGI_FORMAT_R8G8B8A8_UNORM. Como alternativa, você pode criar seu dispositivo com D3D10_CREATE_DEVICE_BGRA_SUPPORT para garantir que você só dê suporte a computadores com o runtime do Direct3D 11.0 e um driver WDDM 1.1 ou superior instalado.
²DXGI 1.0 definiu os formatos 5:6:5 e 5:5:5:1, mas eles não tinham suporte no runtime do Direct3D 10.x ou Direct3D 11.0. Opcionalmente, esses formatos têm suporte com DXGI 1.2 no runtime do DirectX 11.1, que é necessário para adaptadores de vídeo de nível de recurso 11.1 e drivers WDDM 1.2 (modelo de driver de vídeo a partir de Windows 8) e já tem suporte em níveis de recurso 10level9.
³DXGI 1.2 introduziu o formato 4:4:4:4. Opcionalmente, esse formato tem suporte no runtime do DirectX 11.1, que é necessário para adaptadores de vídeo de nível de recurso 11.1 e drivers WDDM 1.2 e já tem suporte em níveis de recurso 10level9.
Para formatos não compactados, o DXGI limitou o suporte para padrões de formato de pixel arbitrários; todos os formatos descompactados devem ser do tipo RGBA. Isso pode exigir o swizzling de formatos de pixel de ativos existentes, que recomendamos que você calcule como uma passagem de pré-processamento offline sempre que possível.
Portabilidade de sombreadores
Os sombreadores do Direct3D 10 são criados em HLSL
O Direct3D 10 limita o uso da linguagem de assembly apenas para fins de depuração, portanto, todos os sombreadores de assembly escritos à mão usados no Direct3D 9 precisarão ser convertidos em HLSL.
Assinaturas e vinculação de sombreador
Discutimos os requisitos para a vinculação do assembly de entrada às assinaturas de entrada do sombreador de vértice anteriormente neste documento (veja acima). Observe que o runtime do Direct3D 10 também restringiu os requisitos de vinculação de estágio a estágio entre sombreadores. Essa alteração afetará as fontes de sombreador em que a associação entre os estágios pode não ter sido totalmente descrita no Direct3D 9. Por exemplo:
VS_OUTPUT PS_INPUT
float4 pos : SV_POSITION; float4 pos : SV_POSITION;
float4 uv1 : TEXCOORD1; float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4 Color : TEXCOORD6; float4 color : TEXCOORD6;
* VS quebrado - Ligação PS - mesmo que o sombreador de pixel possa não estar interessado na matriz completa, a ligação deve especificar o float4x3 completo.
Observe que a semântica de vinculação entre os estágios deve corresponder exatamente, no entanto, as entradas dos estágios de destino podem ser um prefixo dos valores que estão sendo gerados. No exemplo acima, o sombreador de pixel pode ter position e texcoord1 como as únicas entradas, mas não pode ter a posição e texcoord2 como as únicas entradas devido às restrições de ordenação.
Vinculações de estágio de sombreador HLSL
A ligação entre sombreadores pode ocorrer em qualquer um dos seguintes pontos no pipeline:
- Assembler de entrada para sombreador de vértice
- Sombreador de vértice para sombreador de pixel
- Sombreador de vértice para sombreador de geometria
- Sombreador de vértice para saída de fluxo
- Sombreador de geometria para sombreador de pixel
- Sombreador de geometria para transmitir
Buffers constantes
Para facilitar a portabilidade de conteúdo do Direct3D 9, uma abordagem inicial para o gerenciamento constante fora do sistema de efeitos pode envolver a criação de um único buffer constante contendo todas as constantes necessárias. É importante para o desempenho ordenar constantes em buffers pela frequência esperada de atualização. Essa organização reduzirá a quantidade de conjuntos de constantes redundantes ao mínimo.
Planos de clipe do usuário no HLSL no nível de recurso 9 e superior
A partir do Windows 8, você pode usar o atributo de função clipplanes em uma declaração de função HLSL em vez de SV_ClipDistance para fazer com que o sombreador funcione no nível de recurso 9_x, bem como no nível de recurso 10 e superior. Para obter mais informações, consulte Planos de clipe do usuário no hardware de nível de recurso 9.
Diferenças adicionais do Direct3D 10 a serem observadas
Números inteiros como entrada
No Direct3D 9, não havia suporte de hardware real para tipos de dados inteiros, no entanto, o hardware do Direct3D 10 dá suporte a tipos inteiros explícitos. Se você tiver dados de ponto flutuante em seu buffer de vértice, deverá ter uma entrada flutuante. Caso contrário, um tipo inteiro será a representação do padrão de bits do valor de ponto flutuante. Um tipo inteiro não é permitido para uma entrada de sombreador de pixel, a menos que o valor seja marcado para nenhuma interpolação (consulte Modificadores de interpolação).
Cursores do mouse
Nas versões anteriores do Windows, as rotinas de cursor do mouse GDI padrão não funcionavam corretamente em todos os dispositivos exclusivos de tela inteira. As APIs SetCursorProperties, ShowCursor e SetCursorPosition foram adicionadas para lidar com esses casos. Como a versão do GDI do Windows Vista entende totalmente as superfícies DXGI , não há necessidade dessa API especializada do cursor do mouse, portanto, não há equivalente ao Direct3D 10. Em vez disso, os aplicativos Direct3D 10 devem usar as rotinas de cursor de mouse GDI padrão para cursores de mouse.
Mapeando texels para pixels no Direct3D 10
No Direct3D 9, os centros de texel e os centros de pixel estavam separados por meia unidade (consulte Mapeando diretamente texels para pixels (Direct3D 9)). No Direct3D 10, os centros de texel já estão em meias unidades, portanto, não há necessidade de deslocar as coordenadas de vértice.
A renderização de quads em tela inteira é mais simples com o Direct3D 10. Os quads de tela inteira devem ser definidos no clipspace (-1,1) e simplesmente passados pelo sombreador de vértice sem alterações. Dessa forma, não há necessidade de recarregar o buffer de vértices toda vez que a resolução da tela for alterada e não há trabalho extra no sombreador de pixel para manipular as coordenadas de textura.
Alterações no comportamento de contagem de referência
Ao contrário das versões anteriores do Direct3D, as várias funções Set não manterão uma referência aos objetos de dispositivos. Isso significa que o aplicativo deve garantir que ele mantenha uma referência no objeto pelo tempo que quiser que esse objeto seja associado ao pipeline. Quando a contagem de referências do objeto cair para zero, o objeto será desvinculado do pipeline à medida que for destruído. Esse estilo de retenção de referência também é conhecido como retenção de referência fraca, portanto, cada local de associação no objeto Device contém uma referência fraca à interface/objeto. A menos que explicitamente mencionado de outra forma, esse comportamento deve ser assumido para todos os métodos Set. Sempre que a destruição de um objeto fizer com que um ponto de ligação seja definido como NULL out, a camada de depuração emitirá um aviso. Observe que as chamadas para métodos Get do dispositivo, como OMGetRenderTargets , aumentarão a contagem de referência de objetos que estão sendo retornados.
Nível cooperativo de teste
A funcionalidade da API do Direct3D 9 TestCooperativeLevel é análoga à configuração do DXGI_PRESENT_TEST ao chamar Present.
StretchRect
Uma função semelhante ao método IDirect3DDevice9::StretchRect do Direct3D 9 não está disponível no Direct3D 10 e 10.1. Para copiar superfícies de recursos, use ID3D10Device::CopySubresourceRegion. Para operações de redimensionamento, renderize em uma textura usando a filtragem de textura. Para converter superfícies MSAA em superfícies não MSAA, use ID3D10Device::ResolveSubresource.
Diferenças adicionais do Direct3D 10.1
O Windows Vista com Service Pack 1 (SP1) incluiu uma pequena atualização para o Direct3D 10 e o Direct3D 10.1, que expôs os seguintes recursos de hardware adicionais:
- Sombreadores por exemplo de MSAA
- Leitura de profundidade MSAA
- Modos de mesclagem independentes por destino de renderização
- Matrizes de mapas de cubo
- Renderizar em formatos compactados em bloco (BC)
A atualização do Direct3D 10.1 adicionou suporte para as seguintes novas interfaces, que são derivadas de interfaces existentes:
A atualização do Direct3D 10.1 também incluiu as seguintes estruturas adicionais:
A API do Direct3D 10.1 inclui um novo conceito chamado nível de recurso. Esse conceito significa que você pode usar a API do Direct3D 10.1 para conduzir o hardware do Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) ou do Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1). Como a API do Direct3D 10.1 é derivada das interfaces do Direct3D 10, os aplicativos podem criar um dispositivo Direct3D 10.1 e, em seguida, usá-lo como um dispositivo Direct3D 10.0, exceto quando novos recursos específicos do 10.1 forem necessários (desde que o nível de recurso D3D10_FEATURE_LEVEL_10_1 esteja presente e dê suporte a esses recursos).
Observação
Os dispositivos Direct3D 10.1 podem usar os perfis de sombreador HLSL 10.0 existentes (vs_4_0, ps_4_0, gs_4_0) e os novos perfis 10.1 (vs_4_1, ps_4_1 gs_4_1) com instruções e recursos HLSL adicionais.
O Windows 7 continha uma pequena atualização para a API do Direct3D 10.1 incluída no runtime do Direct3D 11. Esta atualização adiciona suporte para os seguintes níveis de recursos:
O Windows 7 também adicionou suporte ao Direct3D 10.1 para WARP (Plataforma de Rasterização Avançada) do Windows. Você pode especificar um driver WARP usando D3D10_DRIVER_TYPE_WARP.
Para obter mais informações sobre o Direct3D 10.1, consulte Recursos do Direct3D 10.1 e a enumeração D3D10_FEATURE_LEVEL1.
Tópicos relacionados