Convertendo em Direct3D 9
Os recursos a seguir foram alterados no Microsoft Direct3D 9. Se você estiver usando esses recursos, consulte as alterações listadas abaixo para ajudá-lo a portar seu aplicativo para o Direct3D 9.
- Alterações de BaseVertexIndex
- Alterações de CreateImageSurface
- D3DENUM_NO_WHQL_LEVEL alterações
- Criar alterações de recurso
- Alterações de EnumAdapterModes
- Obter/SetStreamSource_Changes
- Alterações de qualidade multisampling
- Alterações de ResourceManagerDiscardBytes
- SetSoftwareVertexProcessing Changes
- Alterações do sampler de textura
- Alterações na declaração de vértice
- Intervalos, _and_SwapEffects_Changes
Alterações de BaseVertexIndex
No DirectX 8.x, IDirect3DDevice8::SetIndices exigia um ponteiro para o buffer de índice e um BaseVertexIndex para a posição inicial no buffer de vértice. Um aplicativo que coloca objetos diferentes em lote no buffer de vértice precisava alternar o buffer de índice (ou fazer uma chamada para IDirect3DDevice8::SetIndices) antes de chamar IDirect3DDevice8::D rawIndexedPrimitive.
No Direct3D 9, a posição inicial no buffer de vértice, BaseVertexIndex, foi movida para IDirect3DDevice9::D rawIndexedPrimitive e seu tipo de dados foi alterado de um DWORD para um INT.
HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
D3DPRIMITIVETYPE PrimType,
INT BaseVertexIndex,
UINT minIndex,
UINT NumVertices,
UINT startIndex,
UINT primCount);
HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData);
Alterações de CreateImageSurface
IDirect3DDevice8::CreateImageSurface foi renomeado como CreateOffscreenPlainSurface. Um parâmetro adicional que usa um tipo D3DPOOL foi adicionado. D3DPOOL_SCRATCH retornará uma superfície que tem características idênticas a uma superfície criada por IDirect3DDevice8::CreateImageSurface. D3DPOOL_DEFAULT é o pool apropriado para uso com StretchRect e ColorFill.
D3DENUM_NO_WHQL_LEVEL alterações
Os aplicativos agora precisam solicitar explicitamente o WHQL (Microsoft Windows Hardware Quality Labs) porque a resposta leva relativamente longo (alguns segundos). D3DENUM_NO_WHQL_LEVEL foi removido e D3DENUM_WHQL_LEVEL foi adicionado.
Criar alterações de recurso
Um identificador foi adicionado a vários métodos e deve ser definido como NULL. Os métodos afetados incluem:
- Createtexture
- CreateVolumeTexture
- CreateCubeTexture
- Createvertexbuffer
- CreateIndexBuffer
- CreateRenderTarget
- CreateDepthStencilSurface
- CreateOffscreenPlainSurface
Alterações de EnumAdapterModes
O EnumAdapterModes agora usa um D3DFORMAT.
HRESULT IDirect3D9::EnumAdapterModes(
UINT Adapter,
D3DFORMAT Format,
UINT Mode,
D3DDISPLAYMODE *pMode);
O formato dá suporte a um conjunto de modos de exibição em expansão. Para proteger os aplicativos contra formatos de enumeração que não foram inventados quando o aplicativo foi enviado, o aplicativo deve informar ao Direct3D o formato dos modos de exibição que devem ser enumerados. A matriz resultante de modos de exibição será diferente apenas pela largura, altura e taxa de atualização.
O aplicativo especifica um formato de pixel e a enumeração é restrita aos modos de exibição que correspondem exatamente ao formato. Veja a seguir uma lista dos formatos permitidos:
- D3DFMT_A1R5G5B5
- D3DFMT_A2B10G10R10
- D3DFMT_A8R8G8B8
- D3DFMT_R5G6B5
- D3DFMT_X1R5G5B5
- D3DFMT_X8R8G8B8
A enumeração é equivalente a versões alfa e nonalpha do mesmo formato. O Formato retornado sempre será preenchido com o mesmo formato fornecido pelo aplicativo.
Esse método trata 565 e 555 como equivalentes e retorna a versão correta no Formato. A diferença entra em jogo somente quando o aplicativo bloqueia o buffer traseiro e há um sinalizador explícito que o aplicativo deve definir para fazer isso.
Alterações de Get/SetStreamSource
Um parâmetro foi adicionado aos métodos GetStreamSource e SetStreamSource . O deslocamento é o número de bytes entre o início do fluxo e o início dos dados de vértice. É medido em bytes. Isso permite que o pipeline dê suporte a deslocamentos de fluxo. Para descobrir se o dispositivo dá suporte a deslocamentos de fluxo, consulte D3DDEVCAPS2_STREAMOFFSET.
HRESULT GetStreamSource(
UINT StreamNumber,
IDirect3DVertexBuffer9 **ppStreamData,
UINT *pOffsetInBytes,
UINT *pStride);
Alterações de qualidade multisampling
Anteriormente, havia apenas a enumeração D3DMULTISAMPLE_TYPE. O Direct3D 9 retém essa enumeração e adiciona a ideia de um nível de qualidade para cada elemento da enumeração. O nível de qualidade indica uma compensação entre a qualidade visual e o desempenho indicando o número de amostras mascaradas (no sentido de D3DRS_MULTISAMPLEMASK).
Um aplicativo deve escolher quantos exemplos podem ser mascarados necessários e, em seguida, consultar pQualityLevels. Se diferente de zero, esse valor indica o número de níveis de qualidade que o aplicativo pode passar para as várias funções de criação por meio de MultiSampleQuality. Como os drivers expõem todos os esquemas de várias amostras como níveis de qualidade em D3DMULTISAMPLE_NONMASKABLE, você pode enumerar todos os esquemas multisampling disponíveis por meio desse tipo se o aplicativo não precisar mascarar amostras.
A D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE bit caps foi desativada. Esse bit costumava significar que o método multisampling não dava suporte a máscaras de gravação e não podia ser ativado e desativado entre BeginScene e EndScene. Esses métodos não possíveis agora são expostos por meio de D3DMULTISAMPLE_NONMASKABLE.
HRESULT CheckDeviceMultiSampleType(
UINT Adapter,
D3DDEVTYPE DeviceType,
D3DFORMAT SurfaceFormat,
BOOL Windowed,
D3DMULTISAMPLE_TYPE MultiSampleType,
DWORD * pQualityLevels);
Há um máximo diferente para cada número de amostras mascaradas. Por exemplo, D3DMULTISAMPLE_4_SAMPLES pode ter três níveis de qualidade, enquanto D3DMULTISAMPLE_2_SAMPLES pode ter apenas um. Há no máximo oito níveis de qualidade para cada número de amostras mascaradas (o driver não tem permissão para expressar mais). A qualidade varia de zero a (*pQualityLevels - 1).
Alterações de ResourceManagerDiscardBytes
ResourceManagerDiscardBytes foi substituído por IDirect3DDevice9::EvictManagedResources. Ele pode remover todos os recursos, tanto o Direct3D quanto os recursos do driver.
O gerenciador de recursos agora é consultado quando um recurso (seja gerenciado ou não) falha na criação porque não há memória de vídeo insuficiente. O gerente será solicitado automaticamente a liberar recursos suficientes para que a criação seja bem-sucedida. No DirectX 8.0, esse não era um processo automatizado.
SetSoftwareVertexProcessing Changes
Um aplicativo pode criar um dispositivo de modo misto para usar o processamento de vértice de software e hardware.
Para alternar entre os dois modos de processamento de vértice no DirectX 8.x, chame IDirect3DDevice8::SetRenderState. Isso foi substituído por SetSoftwareVertexProcessing para aliviar problemas causados por blocos de estado. Esse novo método não é registrado por blocos de estado.
Alterações do sampler de textura
O Direct3D 9 dá suporte a até dezesseis superfícies de textura em uma passagem usando o modelo de sombreador de pixel 2_0; no entanto, o número de coordenadas de textura permanece limitado a oito. O estado do estágio de textura está associado a superfícies, conjuntos de coordenadas, processamento de vértice e processamento de pixels. Para gerenciar essas diferenças em tempo de compilação, SetTextureStageState foi dividido em dois métodos:
- IDirect3DDevice9::SetTextureStageState ainda será usado para o estado da coordenada de textura, como modos de encapsulamento e geração de coordenadas de textura.
- SetSamplerState foi adicionado e agora será usado para filtragem, bloco, fixação, MIPLOD e assim por diante. Isso funcionará para até dezesseis amostradores.
Alterações de SetTextureStageState
IDirect3DDevice9::SetTextureStageState agora define os seguintes estados:
Correção do estado de processamento de vértice da função. Esse estado controla a manipulação de coordenadas de textura D3DTSS_TEXTURETRANSFORMFLAGS e D3DTSS_TEXCOORDINDEX. Até oito de cada um pode ser definido (porque há suporte para oito coordenadas de textura). D3DTSS_TEXCOORDINDEX é um estado de processamento de vértice de função fixo. Se um sombreador de vértice programável for usado, esse estado será ignorado.
Correção do estado do sombreador de pixel de função (o TextureStageState herdado).
- D3DTSS_ALPHAARG0
- D3DTSS_ALPHAARG1
- D3DTSS_ALPHAARG2
- D3DTSS_ALPHAOP
- D3DTSS_BUMPENVLOFFSET
- D3DTSS_BUMPENVLSCALE
- D3DTSS_BUMPENVMAT00
- D3DTSS_BUMPENVMAT01
- D3DTSS_BUMPENVMAT10
- D3DTSS_BUMPENVMAT11
- D3DTSS_COLORARG0
- D3DTSS_COLORARG1
- D3DTSS_COLORARG2
- D3DTSS_COLOROP
- D3DTSS_RESULTARG
O número de estados de sombreador de pixel de função fixa que podem ser definidos é menor ou igual ao número representado por MaxTextureBlendStages.
O número de amostras de textura disponíveis para o aplicativo é determinado pela versão do sombreador de pixel, conforme indicado na tabela a seguir.
Nome | Número |
---|---|
ps_1_1 para ps_1_3 | 4 amostras de textura |
ps_1_4 | 6 amostras de textura |
ps_2_0 | 16 amostras de textura |
pipeline de função fixa | Amostras de textura MaxTextureBlendStages/MaxSimultaneousTextures |
Os dispositivos que dão suporte ao mapeamento de deslocamento no Direct3D 9 darão suporte a um amostrador adicional (D3DDMAPSAMPLER), que amostra os mapas de deslocamento na unidade de mosaico.
Alterações de SetSamplerState
IDirect3DDevice9::SetSamplerState define o estado do sampler (incluindo o usado na unidade de mosaico para amostrar mapas de deslocamento). Eles foram renomeados com um prefixo D3DSAMP_ para habilitar a detecção de erros em tempo de compilação ao fazer a portabilidade do DirectX 8.x. Os estados incluem:
- D3DSAMP_ADDRESSU
- D3DSAMP_ADDRESSV
- D3DSAMP_ADDRESSW
- D3DSAMP_BORDERCOLOR
- D3DSAMP_MAGFILTER
- D3DSAMP_MAXANISOTROPY
- D3DSAMP_MAXMIPLEVEL
- D3DSAMP_MINFILTER
- D3DSAMP_MIPFILTER
- D3DSAMP_MIPMAPLODBIAS
Alterações na declaração de vértice
As declarações de vértice agora são dissociadas da criação do sombreador de vértice. As declarações de vértice agora usam uma interface COM (Component Object Model).
Para o DirectX 8.x, as declarações de vértice são vinculadas a sombreadores de vértice.
- Para o pipeline de função fixa, chame SetVertexShader com o código FVF (formato de vértice flexível) do buffer de vértice.
- Para sombreadores de vértice, chame IDirect3DDevice9::SetVertexShader com um identificador para um sombreador de vértice criado anteriormente. O sombreador inclui uma declaração de vértice.
Para o Direct3D 9, as declarações de vértice são dissociadas de sombreadores de vértice e podem ser usadas com o pipeline de função fixa ou com sombreadores.
- Para o pipeline de função fixa, não é necessário chamar IDirect3DDevice9::SetVertexShader. Se, no entanto, você quiser alternar para o pipeline de função fixa e tiver usado anteriormente um sombreador de vértice, chame IDirect3DDevice9::SetVertexShader(NULL). Quando isso for feito, você ainda precisará chamar SetFVF para declarar o código FVF.
- Ao usar sombreadores de vértice, chame IDirect3DDevice9::SetVertexShader com o objeto de sombreador de vértice. Além disso, chame IDirect3DDevice9::SetFVF para configurar uma declaração de vértice. Isso usa as informações implícitas no FVF. SetVertexDeclaration pode ser chamado no lugar de IDirect3DDevice9::SetFVF porque dá suporte a declarações de vértice que não podem ser expressas com um FVF.
Intervalos e alterações de SwapEffects
Várias alterações foram feitas para dar ao usuário mais controle sobre a taxa de atualização do monitor, a taxa de apresentação e o desenho de buffer frontal versus back-buffer. Elas são as seguintes:
- Foi removido um efeito de troca, D3DSWAPEFFECT_COPY_VSYNC e uma taxa de apresentação, D3DPRESENT_RATE_UNLIMITED.
- Renomeado D3DPRESENT_PARAMETERS. FullScreen_PresentationInterval para PresentationIntervals.
- Adicionado D3DPRESENT_INTERVAL_IMMEDIATE, o que significa que a apresentação não está sincronizada com a sincronização vertical. Assim como no DirectX 8.x, D3DPRESENT_INTERVAL_DEFAULT é definido como zero e é equivalente a D3DPRESENT_INTERVAL_ONE. D3DPRESENT_INTERVAL_DEFAULT é uma conveniência para inicializar D3DPRESENT_PARAMETERS para zero.
Para obter uma explicação detalhada dos modos e dos intervalos com suporte, consulte D3DPRESENT.
Tópicos relacionados