Compartir a través de


Conversión a Direct3D 9

Las siguientes características se cambiaron en Microsoft Direct3D 9. Si usas estas características, consulta los cambios que se enumeran a continuación para ayudarte a migrar la aplicación a Direct3D 9.

Cambios en BaseVertexIndex

En DirectX 8.x, IDirect3DDevice8::SetIndices requería un puntero al búfer de índice y un BaseVertexIndex para la posición inicial en el búfer de vértices. Una aplicación por lotes de objetos diferentes en el búfer de vértices tenía que cambiar el búfer de índice (o realizar una llamada a IDirect3DDevice8::SetIndices) antes de llamar a IDirect3DDevice8::D rawIndexedPrimitive.

En Direct3D 9, la posición inicial en el búfer de vértices, BaseVertexIndex, se ha movido a IDirect3DDevice9::D rawIndexedPrimitive y su tipo de datos cambió de un DWORD a un INT.

HRESULT IDirect3DDevice9::DrawIndexedPrimitive( 
    D3DPRIMITIVETYPE PrimType, 
    INT BaseVertexIndex, 
    UINT minIndex, 
    UINT NumVertices, 
    UINT startIndex, 
    UINT primCount); 

HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData); 

Cambios de CreateImageSurface

IDirect3DDevice8::CreateImageSurface ha cambiado el nombre createOffscreenPlainSurface. Se ha agregado un parámetro adicional que toma un tipo D3DPOOL. D3DPOOL_SCRATCH devolverá una superficie que tenga características idénticas a una superficie creada por IDirect3DDevice8::CreateImageSurface. D3DPOOL_DEFAULT es el grupo adecuado para su uso con StretchRect y ColorFill.

cambios de D3DENUM_NO_WHQL_LEVEL

Las aplicaciones ahora tienen que solicitar explícitamente los Laboratorios de calidad de hardware de Microsoft Windows (WHQL) porque la respuesta tarda relativamente largo (unos segundos). D3DENUM_NO_WHQL_LEVEL se ha quitado y se ha agregado D3DENUM_WHQL_LEVEL.

Crear cambios en los recursos

Se ha agregado un identificador a varios métodos y debe establecerse en NULL. Los métodos afectados incluyen:

Cambios en EnumAdapterModes

EnumAdapterModes ahora toma un D3DFORMAT.

HRESULT IDirect3D9::EnumAdapterModes( 
       UINT Adapter, 
       D3DFORMAT Format, 
       UINT Mode, 
       D3DDISPLAYMODE *pMode); 

El formato admite un conjunto de modos de presentación de expansión. Para proteger las aplicaciones contra la enumeración de formatos que no se inventaron al enviar la aplicación, la aplicación debe indicar a Direct3D el formato de los modos de presentación que se deben enumerar. La matriz resultante de modos de presentación solo variará por ancho, alto y frecuencia de actualización.

La aplicación especifica un formato de píxel y la enumeración está restringida a los modos de presentación que coinciden exactamente con el formato. A continuación se muestra una lista de los formatos permitidos:

  • D3DFMT_A1R5G5B5
  • D3DFMT_A2B10G10R10
  • D3DFMT_A8R8G8B8
  • D3DFMT_R5G6B5
  • D3DFMT_X1R5G5B5
  • D3DFMT_X8R8G8B8

La enumeración es equivalente para las versiones alfa y nonalpha del mismo formato. El formato devuelto siempre se rellenará con el mismo formato proporcionado por la aplicación.

Este método trata 565 y 555 como equivalente y devuelve la versión correcta en formato. La diferencia solo entra en juego cuando la aplicación bloquea el búfer de reserva y hay una marca explícita que la aplicación debe establecer para lograr esto.

Get/SetStreamSource Changes

Se ha agregado un parámetro a los métodos GetStreamSource y SetStreamSource . El desplazamiento es el número de bytes entre el principio de la secuencia y el principio de los datos de vértice. Se mide en bytes. Esto permite que la canalización admita desplazamientos de flujo. Para averiguar si el dispositivo admite desplazamientos de flujo, consulte D3DDEVCAPS2_STREAMOFFSET.

HRESULT GetStreamSource(
    UINT StreamNumber,
    IDirect3DVertexBuffer9 **ppStreamData,
    UINT *pOffsetInBytes,
    UINT *pStride);

Cambios de calidad de muestreo múltiple

Anteriormente, solo había la enumeración D3DMULTISAMPLE_TYPE. Direct3D 9 conserva esta enumeración y agrega la idea de un nivel de calidad para cada elemento de la enumeración. El nivel de calidad indica un equilibrio entre la calidad visual y el rendimiento indicando el número de muestras enmascarables (en el sentido de D3DRS_MULTISAMPLEMASK).

Una aplicación debe elegir cuántas muestras enmascarables requiere y, a continuación, consultar pQualityLevels. Si no es cero, este valor indica el número de niveles de calidad que la aplicación puede pasar a las distintas funciones de creación a través de MultiSampleQuality. Dado que los controladores exponen todos sus esquemas multimuestra como niveles de calidad en D3DMULTISAMPLE_NONMASKABLE, puede enumerar todos los esquemas de muestreo múltiple disponibles a través de este tipo si la aplicación no necesita enmascarar muestras.

El bit de límites de D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE se ha retirado. Este bit solía significar que el método de muestreo múltiple no admitía máscaras de escritura y no se pudo activar y desactivar entre BeginScene y EndScene. Estos métodos no enmascarables ahora se exponen a través de D3DMULTISAMPLE_NONMASKABLE.

HRESULT CheckDeviceMultiSampleType( 
       UINT Adapter, 
       D3DDEVTYPE DeviceType, 
       D3DFORMAT SurfaceFormat, 
       BOOL Windowed, 
       D3DMULTISAMPLE_TYPE MultiSampleType, 
       DWORD * pQualityLevels); 

Hay un máximo diferente para cada número de muestras enmascarables. Por ejemplo, D3DMULTISAMPLE_4_SAMPLES puede tener tres niveles de calidad, mientras que D3DMULTISAMPLE_2_SAMPLES pueden tener solo uno. Hay como máximo ocho niveles de calidad para cada número de muestras enmascarables (el controlador no puede expresar más). La calidad va de cero a (*pQualityLevels - 1).

Cambios de ResourceManagerDiscardBytes

ResourceManagerDiscardBytes se ha reemplazado por IDirect3DDevice9::EvictManagedResources. Puede expulsar todos los recursos, tanto direct3D como los recursos del controlador.

El administrador de recursos ahora se consulta cuando se produce un error en la creación de un recurso (ya sea administrado o no administrado) porque no hay memoria de vídeo insuficiente. Se pedirá automáticamente al administrador que libere suficientes recursos para que la creación se realice correctamente. En DirectX 8.0, esto no era un proceso automatizado.

Cambios de SetSoftwareVertexProcessing

Una aplicación puede crear un dispositivo en modo mixto para usar el procesamiento de vértices de software y hardware.

Para cambiar entre los dos modos de procesamiento de vértices en DirectX 8.x, llame a IDirect3DDevice8::SetRenderState. Esto se ha reemplazado por SetSoftwareVertexProcessing para aliviar los problemas causados por bloques de estado. Este nuevo método no se registra mediante bloques de estado.

Cambios del sampler de textura

Direct3D 9 admite hasta dieciséis superficies de textura en un pase con el modelo de sombreador de píxeles 2_0; sin embargo, el número de coordenadas de textura permanece limitado a ocho. El estado de fase de textura está asociado a superficies, conjuntos de coordenadas, procesamiento de vértices y procesamiento de píxeles. Para administrar estas diferencias en tiempo de compilación, SetTextureStageState se ha dividido en dos métodos:

  • IDirect3DDevice9::SetTextureStageState se seguirá usando para el estado de coordenadas de textura, como los modos de ajuste y la generación de coordenadas de textura.
  • Se ha agregado SetSamplerState y ahora se usará para filtrar, mosaicos, pinzas, MIPLOD, etc. Esto funcionará para hasta dieciséis muestras.

Cambios de SetTextureStageState

IDirect3DDevice9::SetTextureStageState establece ahora los siguientes estados:

  • Se ha corregido el estado de procesamiento de vértices de función. Este estado controla la manipulación de coordenadas de textura D3DTSS_TEXTURETRANSFORMFLAGS y D3DTSS_TEXCOORDINDEX. Se pueden establecer hasta ocho de cada uno (ya que siempre se admiten ocho coordenadas de textura). D3DTSS_TEXCOORDINDEX es un estado fijo de procesamiento de vértices de función. Si se usa un sombreador de vértices programables, este estado se omite.

  • Se ha corregido el estado del sombreador de píxeles de función (textureStageState heredado).

    • 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

    El número de estados fijos de sombreador de píxeles de función que se pueden establecer es menor o igual que el número representado por MaxTextureBlendStages.

El número de muestreadores de textura disponibles para la aplicación viene determinado por la versión del sombreador de píxeles, como se indica en la tabla siguiente.

Nombre Número
ps_1_1 a ps_1_3 4 muestreadores de textura
ps_1_4 6 muestras de textura
ps_2_0 16 muestreadores de textura
canalización de función fija MaxTextureBlendStages/MaxSimultaneousTextures muestreadores de textura

 

Los dispositivos que admiten la asignación de desplazamiento en Direct3D 9 admitirán un muestreador adicional (D3DDMAPSAMPLER), que muestrea los mapas de desplazamiento en la unidad de teselador.

Cambios en SetSamplerState

IDirect3DDevice9::SetSamplerState establece el estado del muestreador (incluido el usado en la unidad de teselador para muestrear mapas de desplazamiento). Se han cambiado de nombre con un prefijo de D3DSAMP_ para habilitar la detección de errores en tiempo de compilación al migrar desde DirectX 8.x. Los estados incluyen:

  • D3DSAMP_ADDRESSU
  • D3DSAMP_ADDRESSV
  • D3DSAMP_ADDRESSW
  • D3DSAMP_BORDERCOLOR
  • D3DSAMP_MAGFILTER
  • D3DSAMP_MAXANISOTROPY
  • D3DSAMP_MAXMIPLEVEL
  • D3DSAMP_MINFILTER
  • D3DSAMP_MIPFILTER
  • D3DSAMP_MIPMAPLODBIAS

Cambios de declaración de vértices

Las declaraciones de vértices ahora se desacoplan de la creación del sombreador de vértices. Las declaraciones de vértices ahora usan una interfaz de Modelo de objetos componentes (COM).

Para DirectX 8.x, las declaraciones de vértices están asociadas a sombreadores de vértices.

  • Para la canalización de funciones fijas, llame a SetVertexShader con el código de formato de vértice flexible (FVF) del búfer de vértices.
  • En el caso de los sombreadores de vértices, llame a IDirect3DDevice9::SetVertexShader con un identificador para crear previamente un sombreador de vértices. El sombreador incluye una declaración de vértice.

Para Direct3D 9, las declaraciones de vértices se desacoplan de los sombreadores de vértices y se pueden usar con la canalización de función fija o con sombreadores.

  • Para la canalización de función fija, no es necesario llamar a IDirect3DDevice9::SetVertexShader. Sin embargo, si quiere cambiar a la canalización de función fija y ha usado previamente un sombreador de vértices, llame a IDirect3DDevice9::SetVertexShader(NULL). Una vez hecho esto, tendrá que llamar a SetFVF para declarar el código FVF.
  • Al usar sombreadores de vértices, llame a IDirect3DDevice9::SetVertexShader con el objeto sombreador de vértices. Además, llame a IDirect3DDevice9::SetFVF para configurar una declaración de vértice. Esto usa la información implícita en el FVF. Se puede llamar a SetVertexDeclaration en lugar de IDirect3DDevice9::SetFVF porque admite declaraciones de vértice que no se pueden expresar con un FVF.

Intervalos y cambios de SwapEffects

Se realizaron varios cambios para proporcionar al usuario más control sobre la frecuencia de actualización del monitor, la tasa de presentación y el dibujo del búfer frontal frente al dibujo del búfer de reserva. Los pasos son los siguientes:

  • Se ha quitado un efecto de intercambio, D3DSWAPEFFECT_COPY_VSYNC y una tasa de presentación, D3DPRESENT_RATE_UNLIMITED.
  • Se ha cambiado el nombre de D3DPRESENT_PARAMETERS. FullScreen_PresentationInterval a PresentationIntervals.
  • Se ha agregado D3DPRESENT_INTERVAL_IMMEDIATE, lo que significa que la presentación no está sincronizada con la sincronización vertical. Como en DirectX 8.x, D3DPRESENT_INTERVAL_DEFAULT se define como cero y equivale a D3DPRESENT_INTERVAL_ONE. D3DPRESENT_INTERVAL_DEFAULT es una comodidad para inicializar D3DPRESENT_PARAMETERS a cero.

Para obtener una explicación detallada de los modos y los intervalos admitidos, consulte D3DPRESENT.

Gráficos de Direct3D 9