Compartir a través de


Consideraciones de Direct3D 9 a Direct3D 10 (Direct3D 10)

En la página siguiente se proporciona un esquema básico de las diferencias clave entre Direct3D 9 y Direct3D 10. En el esquema siguiente se proporciona información detallada para ayudar a los desarrolladores con la experiencia de Direct3D 9 a explorar y relacionarse con Direct3D 10.

Aunque la información de este tema compara Direct3D 9 con Direct3D 10, porque Direct3D 11 se basa en las mejoras realizadas en Direct3D 10 y 10.1, también necesita esta información para migrar de Direct3D 9 a Direct3D 11. Para obtener información sobre cómo ir más allá de Direct3D 10 a Direct3D 11, consulta Migrar a Direct3D 11.

Introducción a los principales cambios estructurales en Direct3D 10

El proceso de representación mediante el dispositivo Direct3D 10 es estructuralmente similar a Direct3D 9.

  • Establecimiento de un origen de flujo de vértices
  • Establecer el diseño de entrada en Direct3D 10 (establecer la declaración de flujo de vértice en Direct3D 9)
  • Declaración de topología primitiva
  • Establecimiento de texturas
  • Establecer objetos de estado
  • Establecer sombreadores
  • Dibujar

La llamada Draw vincula las operaciones entre sí; la ordenación de las llamadas anteriores a la llamada draw es arbitraria. Las principales diferencias en el diseño de la API de Direct3D 10 son las siguientes:

  • Eliminación de la función fija
  • Eliminación de bits CAPS: se garantiza el conjunto de características base de Direct3D 10.
  • Administración más estricta de: acceso a recursos, estado del dispositivo, constantes de sombreador, vinculación de sombreador (entradas y salidas a sombreadores) entre fases
  • Los cambios en el nombre del punto de entrada de la API reflejan el uso de memoria de GPU virtual (Map() en lugar de Lock()).
  • Se puede agregar una capa de depuración al dispositivo en el momento de la creación.
  • La topología primitiva es ahora un estado explícito (separado de la llamada a Draw )
  • Las constantes de sombreador explícitas ahora se almacenan en búferes de constantes.
  • La creación del sombreador se realiza completamente en HLSL. El compilador HLSL ahora reside en el archivo DLL principal de Direct3D 10.
  • Nueva fase programable: sombreador de geometría
  • Eliminación de BeginScene()/EndScene()
  • Funcionalidad común 2D, enfoque y administración de adaptadores implementada en un nuevo componente: DXGI

Eliminación de la función fija

A veces es sorprendente que incluso en un motor de Direct3D 9 que aproveche completamente la canalización programable, sigue habiendo una serie de áreas que dependen de la canalización de función fija (FF). Las áreas más comunes suelen estar relacionadas con la representación alineada en el espacio de pantalla para la interfaz de usuario. Es por este motivo que es probable que tenga que crear un sombreador de emulación FF o un conjunto de sombreadores que proporcionan los comportamientos de reemplazo necesarios.

Esta documentación contiene un documento técnico que contiene orígenes de sombreador de reemplazo para los comportamientos de FF más comunes (consulte Ejemplo de EMU de función fija). Algunos comportamientos de píxeles de función fija, incluida la prueba alfa, se han movido a sombreadores.

Validación del tiempo de creación de objetos de dispositivo

La canalización de Direct3D 10 se ha rediseñado desde el principio en hardware y software con la intención principal de reducir la sobrecarga de CPU (en tiempo de dibujo). Para reducir los costos, a todos los tipos de datos de dispositivo se les ha asignado un objeto con métodos de creación explícitos proporcionados por el propio dispositivo. Esto permite la validación estricta de datos en el momento de la creación de objetos en lugar de durante la llamada a Draw, como suele hacer con Direct3D 9.

Abstracciones y separación del motor

Las aplicaciones, incluidos juegos, que desean admitir Direct3D 9 y Direct3D 10 deben tener las capas de representación abstraidas del resto de la base de código. Hay muchas maneras de lograr esto, pero clave para todos ellos es el diseño de la capa de abstracción para el dispositivo Direct3D de nivel inferior. Todos los sistemas deben comunicarse con el hardware a través de la capa común que está diseñada para proporcionar recursos de GPU y administración de tipos de bajo nivel.

Eliminación directa de las dependencias de Direct3D 9

Al migrar bases de código grandes y probadas previamente, es importante minimizar la cantidad de cambios de código en aquellos que son absolutamente necesarios para conservar los comportamientos probados previamente en el código. Los procedimientos recomendados incluyen documentar claramente dónde cambian los elementos mediante comentarios. A menudo es útil tener un estándar de comentarios para este trabajo que permite la navegación rápida a través de la base de código.

A continuación se muestra una lista de ejemplos de comentarios de bloque de inicio o línea única estándar que se pueden usar para este trabajo.

Elemento Descripción
Direct3D 10 QUITADO
Use esta opción en la que se quitan las líneas o bloques de código.
ACTUALIZACIÓN DE LAS NECESIDADES DE Direct3D 10
Ayuda a agregar notas adicionales al comentario NEED UPDATE que sugiere qué trabajo o nueva API se debe usar para las visitas posteriores al código para la conversión de comportamiento. También se debe usar un uso intensivo de assert(false) donde se produce \\ Direct3D 10 NEEDS UPDATE para asegurarse de que no se ejecuta código errante sin saberlo.
CAMBIO EN Direct3D 10
Las áreas en las que se han producido cambios importantes deben mantenerse para futuras referencias, pero comentadas
Fin de Direct3D 10
Calificador de bloque de código final

 

Para varias líneas de origen, debe usar el estilo C /* */ comentarios también, pero agregue los comentarios de inicio y finalización pertinentes en estas áreas.

Trucos para resolver rápidamente problemas de compilación de aplicaciones

Invalidación de tipos de Direct3D 9

Puede ser útil insertar un archivo de encabezado de alto nivel que contenga definiciones o invalidaciones de tipo para los tipos base de Direct3D 9 que ya no son compatibles con los encabezados de Direct3D 10. Esto le ayudará a minimizar la cantidad de cambios en el código y las interfaces donde hay una asignación directa de un tipo Direct3D 9 al tipo Direct3D 10 recién definido. Este enfoque también es útil para mantener los comportamientos de código juntos en un archivo de origen. En este caso, es una buena idea definir tipos neutrales o con nombre de versión que describen construcciones comunes que se usan para la representación, pero abarcan las API de Direct3D 9 y Direct3D 10. Por ejemplo:

#if defined(D3D9)
typedef IDirect3DIndexBuffer9   IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9  IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer            IDirect3DIndexBuffer;
typedef ID3D10Buffer            IDirect3DVertexBuffer
#endif

Otros ejemplos específicos de Direct3D 10 son:

typedef ID3D10TextureCube   IDirect3DCubeTexture;
typedef ID3D10Texture3D     IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT      D3DVIEWPORT;
typedef ID3D10VertexShader  IDirect3DVertexShader;
typedef ID3D10PixelShader   IDirect3DPixelShader;

Es aconsejable desarrollar aplicaciones de Direct3D 10 y Windows Vista con la versión más reciente de Microsoft Visual Studio. Sin embargo, es posible compilar una aplicación de Windows Vista que depende de Direct3D 10 con la versión anterior de 2003 de Visual Studio. Direct3D 10 es un componente de plataforma de Windows Vista que tiene dependencias (como con el SDK de plataforma de Sp1 de Server 2003) en la siguiente biblioteca: BufferOverflowU.lib es necesario para resolver los problemas del vinculador de comprobación de buffer_security.

Simulación de CAL de dispositivo

Muchas aplicaciones contienen áreas de código que dependen de los datos capS del dispositivo que están disponibles. Para solucionarlo, reemplace la enumeración de dispositivos y obligue a capS del dispositivo a valores razonables. Planee volver a visitar áreas donde haya dependencias en CAPS más adelante para la eliminación completa de CAPS siempre que sea posible.

Conducción de la API de Direct3D 10

Esta sección se centra en los cambios de comportamiento causados por la API de Direct3D 10.

Creación de recursos

La API de Direct3D 10 ha diseñado recursos como tipos de búfer genéricos que tienen marcas de enlace específicas según el uso planeado. Este punto de diseño se eligió para facilitar el acceso casi ubicuo de los recursos en la canalización para escenarios como la representación en un búfer de vértices y, a continuación, dibujar instantáneamente los resultados sin interrumpir la CPU. En el ejemplo siguiente se muestra la asignación de búferes de vértices y búferes de índice donde puede ver que la descripción del recurso solo difiere según las marcas de enlace de recursos de GPU.

La API de Direct3D 10 ha proporcionado métodos auxiliares de textura para crear explícitamente recursos de tipo de textura, pero como se puede imaginar, estas son funciones realmente auxiliares.

  • CreateTexture2D()
  • CreateTextureCube()
  • CreateTexture3D()

Cuando el destino es Direct3D 10, es probable que quiera asignar más elementos durante el tiempo de creación de recursos al que se usa con Direct3D 9. Esto se volverá más evidente con la creación de búferes de destino de representación y texturas donde también debe crear una vista para acceder al búfer y establecer el recurso en el dispositivo.

Tutorial 1: Conceptos básicos de Direct3D 10

Nota

Direct3D 10 y versiones posteriores de Direct3D amplían el formato de archivo DDS para admitir nuevos formatos DXGI, matrices de texturas y matrices de mapa de cubo. Para obtener más información sobre la extensión de formato de archivo DDS, vea la Guía de programación para DDS.

 

Vistas

Una vista es una interfaz de tipo específica para los datos almacenados en un búfer de píxeles. Un recurso puede tener varias vistas asignadas a la vez y esta característica se resalta en el ejemplo De representación de paso único a mapa de cubo incluido en este SDK.

Página guía de programadores en Acceso a recursos

Ejemplo cubemap

Acceso a recursos estáticos frente a dinámicos

Para obtener el mejor rendimiento, las aplicaciones deben particionar sus datos en términos de la naturaleza estática frente a dinámica de los datos. Direct3D 10 se ha diseñado para aprovechar este enfoque y, como tal, las reglas de acceso para los recursos se han ajustado significativamente a través de Direct3D 9. Para los recursos estáticos, lo ideal es rellenar el recurso con sus datos durante el tiempo de creación. Si el motor se ha diseñado alrededor del punto de diseño Create, Lock, Fill, Unlock de Direct3D 9, puede aplazar el rellenado desde Create time mediante un recurso de almacenamiento provisional y el método UpdateSubResource en la interfaz de recursos.

Efectos de Direct3D 10

El uso del sistema Direct3D 10 Effects está fuera del ámbito de este artículo. El sistema se ha escrito para aprovechar al máximo las ventajas arquitectónicas que proporciona Direct3D 10. Consulte la sección Efectos (Direct3D 10) para obtener más información sobre su uso.

HLSL sin efectos

La canalización del sombreador de Direct3D 10 se puede controlar sin el uso del sistema Efectos de Direct3D 10. Tenga en cuenta que, en este caso, toda la aplicación debe administrar todos los búferes de constantes, sombreador, sampler y enlace de textura. Consulte el vínculo de ejemplo y las secciones siguientes de este documento para obtener más detalles:

Ejemplo de HLSL sin efectos

Compilación del sombreador

El compilador HLSL de Direct3D 10 aporta mejoras a la definición del lenguaje HLSL y, por tanto, tiene la capacidad de operar en dos modos. Para obtener compatibilidad completa con funciones intrínsecas y semánticas de estilo direct3D 9, se debe invocar la compilación con la marca MODO DE COMPATIBILIDAD que se puede especificar por compilación.

El modelo de sombreador 4.0 semántica de lenguaje HLSL y funciones intrínsecas para Direct3D 10 se puede encontrar en HLSL. Los principales cambios en la sintaxis de Direct3D 9 HLSL para tener la mayor nota de están en el área de acceso de textura. La nueva sintaxis es el único formulario admitido por el compilador fuera del modo de compatibilidad.

Nota

Las API de tipo compilador de Direct3D 10 (D3D10CompileShader y D3D10CompileEffectFromMemory) se proporcionan mediante los entornos de ejecución de Direct3D 10, 10.1 y 11 que se ejecutan en Windows Vista y versiones posteriores. Las API de tipo compilador de Direct3D 10 tienen la misma funcionalidad que el compilador HLSL que se incluye en el SDK de DirectX (diciembre de 2006). Este compilador de HLSL no admite los perfiles de Direct3D 10.1 (vs_4_1, ps_4_1, gs_4_1, fx_4_1) y falta una serie de optimizaciones y mejoras. Puede obtener un compilador HLSL que admita los perfiles de Direct3D 10.1 de la versión más reciente del SDK de DirectX heredado. Para obtener información sobre el SDK de DirectX heredado, consulte ¿Dónde está el SDK de DirectX?. Puede obtener las API más recientes de HLSL Fxc.exe compilador de línea de comandos y D3DCompiler desde Windows SDK.

 

Creación de recursos de sombreador

La creación de instancias de sombreador compiladas fuera del sistema Efectos de Direct3D 10 se realiza de forma muy similar a Direct3D 9, sin embargo, en Direct3D 10, es importante mantener la firma de entrada del sombreador alrededor para su uso posterior. La firma se devuelve de forma predeterminada como parte del blob del sombreador, pero se puede extraer para reducir los requisitos de memoria si es necesario. Para obtener más información, consulte Uso de sombreadores en Direct3D 10.

Interfaz de capa de reflexión del sombreador

La capa de reflexión del sombreador es la interfaz por la que se puede obtener información sobre los requisitos del sombreador. Esto es especialmente útil al crear vínculos de ensamblado de entrada (vea a continuación), donde es posible que tenga que atravesar los requisitos de entrada del sombreador para asegurarse de que está proporcionando la estructura de entrada correcta al sombreador. Puede crear una instancia de la interfaz de capa de reflexión al mismo tiempo que la creación de una instancia de un sombreador compilado.

La capa de reflexión del sombreador reemplaza los métodos D3DX9 que proporcionan una funcionalidad similar. Por ejemplo , IsParameterUsed se reemplaza por el método GetDesc .

Diseños del ensamblador de entrada: sombreador de vértices o vinculación de flujo de entrada

El ensamblador de entrada (IA) reemplaza la declaración de flujo de vértice de estilo Direct3D 9 y su estructura de descripción es muy similar en forma. La principal diferencia que aporta la IA es que el objeto de diseño ia creado debe asignarse directamente a un formato específico de firma de entrada del sombreador. El objeto de asignación creado para vincular el flujo de entrada al sombreador se puede usar en cualquier número de sombreadores donde la firma de entrada del sombreador coincide con la del sombreador utilizado para crear el diseño de entrada.

Para impulsar mejor la canalización con datos estáticos, debe tener en cuenta las permutaciones del formato de flujo de entrada a posibles firmas de entrada de sombreador y crear las instancias del objeto de diseño ia tan pronto como sea posible y reutilizarlas siempre que sea posible.

Impacto de la eliminación de código fallido del sombreador

En la siguiente sección se detalla una diferencia significativa entre Direct3D 9 y Direct3D 10 que es probable que requiera un control cuidadoso en el código del motor. Los sombreadores que contienen expresiones condicionales suelen tener determinadas rutas de acceso de código eliminadas como parte del proceso de compilación. En Direct3D 9, se pueden quitar dos tipos de entradas (marcadas para su eliminación) cuando no se usan: entradas de firma (como en el ejemplo siguiente) y entradas constantes. Si el final del búfer de constantes contiene entradas sin usar, la declaración de tamaño en el sombreador reflejará el tamaño del búfer de constantes sin las entradas sin usar al final. Ambos tipos de entradas permanecen en firmas o búferes de constantes Direct3D 10 con una excepción especial en el caso de entradas constantes sin usar al final de un búfer de constantes. Esto puede tener un impacto en el motor al controlar sombreadores grandes y crear diseños de entrada. Los elementos que se quitan mediante optimizaciones de código no enviados en el compilador deben declararse en la estructura de entrada. En el siguiente ejemplo se muestra esto:

Ejemplo de estructura de entrada del sombreador de vértices

struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};

* Eliminación de código fallido de Direct3D 9 quitaría la declaración en el sombreador debido a la eliminación condicional de código no válido

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;
}

O bien, podría hacer que sea aún más obvio que la constante es una constante en tiempo de compilación con la siguiente declaración:

#define LIGHT_MAPPED false

En el ejemplo anterior, en Direct3D 9, el elemento uv2 se quitaría debido a optimizaciones de código no enviados en el compilador. En Direct3D 10, el código fallido se seguirá quitando, pero el diseño del ensamblador de entrada del sombreador requiere que exista la definición de los datos de entrada. La capa de reflexión del sombreador proporciona los medios para controlar esta situación de forma genérica mediante la cual puede atravesar los requisitos de entrada del sombreador y asegurarse de proporcionar una descripción completa del flujo de entrada para la asignación de firmas del sombreador.

Esta es una función de ejemplo para detectar la existencia de un nombre o índice semántico en una firma de función:

// 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, &paramDesc);
        if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex) 
            return true;
    }

    return false;
}

Creación de objetos de estado

Al migrar el código del motor, puede ayudar a usar inicialmente un conjunto predeterminado de objetos de estado y deshabilitar todos los valores de estado de representación del dispositivo Direct3D 9 o de textura. Esto provocará la representación de artefactos, pero es la manera más rápida de poner en marcha las cosas. Más adelante puede construir un sistema de administración de objetos de estado que puede usar una clave compuesta para habilitar la reutilización máxima del número de objetos de estado que se usan.

Migración de texturas

Formatos de archivo admitidos

Las funciones D3DXxxCreateXXX y D3DXxxSaveXXX que crean o guardan una textura de o en un archivo gráfico (por ejemplo, D3DX10CreateTextureFromFile) admiten un conjunto diferente de formatos de archivo en Direct3D 10 que en Direct3D 9:

Formato de archivo Direct3D 9 Direct3D 10
.bmp x x
.jpg x x
.tga x
.png x x
.dds x x
.Ppm x
.dib x
.Hdr x
.Pfm x
.tiff x
.gif x
.tif x

 

Para obtener más información, compare las enumeraciones de Direct3D 9 D3DXIMAGE_FILEFORMAT con las enumeraciones D3DX10_IMAGE_FILE_FORMAT para Direct3D 10.

Nota:

La biblioteca de utilidades D3DX (D3DX 9, D3DX 10 y D3DX 11) está en desuso para Windows 8. Para el procesamiento de archivos de textura, se recomienda usar DirectXTex.

 

Formatos de textura de asignación

En la tabla siguiente se muestra la asignación de formatos de textura de Direct3D 9 a Direct3D 10. Cualquier contenido en formatos que no estén disponibles en DXGI deberá convertirse por rutinas de utilidad.

Formato de Direct3D 9 Formato direct3D 10
D3DFMT_UNKNOWN DXGI_FORMAT_UNKNOWN
D3DFMT_R8G8B8 No disponible
D3DFMT_A8R8G8B8 & DXGI_FORMAT_B8G8R8A8_UNORM DXGI_FORMAT_B8G8R8A8_UNORM_SRGB DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
D3DFMT_X8R8G8B8 & DXGI_FORMAT_B8G8R8X8_UNORM DXGI_FORMAT_B8G8R8X8_UNORM_SRGB DXGI_FORMAT_B8G8R8X8_UNORM_SRGB
D3DFMT_R5G6B5 DXGI_FORMAT_B5G6R5_UNORM²
D3DFMT_X1R5G5B5 No disponible
D3DFMT_A1R5G5B5 DXGI_FORMAT_B5G5R5A1_UNORM²
D3DFMT_A4R4G4B4 DXGI_FORMAT_B4G4R4A4_UNORM³
D3DFMT_R3G3B2 No disponible
D3DFMT_A8 DXGI_FORMAT_A8_UNORM
D3DFMT_A8R3G3B2 No disponible
D3DFMT_X4R4G4B4 No disponible
D3DFMT_A2B10G10R10 DXGI_FORMAT_R10G10B10A2
D3DFMT_A8B8G8R8 DXGI_FORMAT_R8G8B8A8_UNORM & DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
D3DFMT_X8B8G8R8 No disponible
D3DFMT_G16R16 DXGI_FORMAT_R16G16_UNORM
D3DFMT_A2R10G10B10 No disponible
D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_UNORM
D3DFMT_A8P8 No disponible
D3DFMT_P8 No disponible
D3DFMT_L8 DXGI_FORMAT_R8_UNORM Nota: Use .r swizzle en el sombreador para duplicar el color rojo a otros componentes para obtener el comportamiento de D3D9.
D3DFMT_A8L8 DXGI_FORMAT_R8G8_UNORM Nota: Use swizzle .rrrg en el sombreador para duplicar el color rojo y mover el color verde a los componentes alfa para obtener el comportamiento D3D9.
D3DFMT_A4L4 No disponible
D3DFMT_V8U8 DXGI_FORMAT_R8G8_SNORM
D3DFMT_L6V5U5 No disponible
D3DFMT_X8L8V8U8 No disponible
D3DFMT_Q8W8V8U8 DXGI_FORMAT_R8G8B8A8_SNORM
D3DFMT_V16U16 DXGI_FORMAT_R16G16_SNORM
D3DFMT_W11V11U10 No disponible
D3DFMT_A2W10V10U10 No disponible
D3DFMT_UYVY No disponible
D3DFMT_R8G8_B8G8 DXGI_FORMAT_G8R8_G8B8_UNORM (en DX9, los datos se escalaron verticalmente en 255.0f, pero esto se puede controlar en el código del sombreador).
D3DFMT_YUY2 No disponible
D3DFMT_G8R8_G8B8 DXGI_FORMAT_R8G8_B8G8_UNORM (en DX9, los datos se escalaron verticalmente en 255.0f, pero esto se puede controlar en el código del 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 y DXT2 son los mismos desde una perspectiva de API/hardware... solo la diferencia era "alfa premultiplicado", que una aplicación puede realizar un seguimiento y no necesita un formato independiente.
D3DFMT_DXT3 DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
D3DFMT_DXT4 & DXGI_FORMAT_BC2_UNORM DXGI_FORMAT_BC2_UNORM_SRGB Nota: DXT3 y DXT4 son los mismos desde una perspectiva de API/hardware... solo la diferencia era "alfa premultiplicado", que una aplicación puede realizar un seguimiento y no necesita un formato independiente.
D3DFMT_DXT5 DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB
D3DFMT_D16 & D3DFMT_D16_LOCKABLE DXGI_FORMAT_D16_UNORM
D3DFMT_D32 No disponible
D3DFMT_D15S1 No disponible
D3DFMT_D24S8 No disponible
D3DFMT_D24X8 No disponible
D3DFMT_D24X4S4 No disponible
D3DFMT_D16 DXGI_FORMAT_D16_UNORM
D3DFMT_D32F_LOCKABLE DXGI_FORMAT_D32_FLOAT
D3DFMT_D24FS8 No disponible
D3DFMT_S1D15 No disponible
D3DFMT_S8D24 DXGI_FORMAT_D24_UNORM_S8_UINT
D3DFMT_X8D24 No disponible
D3DFMT_X4S4D24 No disponible
D3DFMT_L16 DXGI_FORMAT_R16_UNORM Nota: Use .r swizzle en el sombreador para duplicar el color rojo a otros componentes para obtener el comportamiento de D3D9.
D3DFMT_INDEX16 DXGI_FORMAT_R16_UINT
D3DFMT_INDEX32 DXGI_FORMAT_R32_UINT
D3DFMT_Q16W16V16U16 DXGI_FORMAT_R16G16B16A16_SNORM
D3DFMT_MULTI2_ARGB8 No disponible
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 No disponible
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 No disponible
D3DDECLTYPE_UBYTE4 DXGI_FORMAT_R8G8B8A8_UINT Nota: El sombreador obtiene valores UINT, pero si se necesitan elementos flotantes enteros de estilo Direct3D 9 (0,0f, 1,0f... 255.f), UINT se puede convertir a float32 en el sombreador.
D3DDECLTYPE_SHORT2 DXGI_FORMAT_R16G16_SINT Nota: El sombreador obtiene valores SINT, pero si se necesitan floats enteros de estilo Direct3D 9, SINT solo se puede convertir a float32 en el sombreador.
D3DDECLTYPE_SHORT4 DXGI_FORMAT_R16G16B16A16_SINT Nota: El sombreador obtiene valores SINT, pero si se necesitan valores enteros de estilo direct3D 9, SINT se puede convertir a float32 en el 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 No disponible
D3DDECLTYPE_DEC3N No disponible
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 se incluye en el tiempo de ejecución de Direct3D 11, incluye formatos BGRA. Sin embargo, la compatibilidad con estos formatos es opcional para dispositivos Direct3D 10 y 10.1 con controladores que se implementan en el modelo de controladores de pantalla de Windows (WDDM) para Windows Vista (WDDM 1.0). Considere la posibilidad de usar DXGI_FORMAT_R8G8B8A8_UNORM en su lugar. Como alternativa, puedes crear el dispositivo con D3D10_CREATE_DEVICE_BGRA_SUPPORT para asegurarte de que solo admites equipos con el entorno de ejecución de Direct3D 11.0 y un controlador WDDM 1.1 o superior instalado.

²DXGI 1.0 definió los formatos 5:6:5 y 5:5:5:1, pero no eran compatibles con el entorno de ejecución de Direct3D 10.x o Direct3D 11.0. Estos formatos son opcionalmente compatibles con DXGI 1.2 en el entorno de ejecución de DirectX 11.1, que es necesario para los adaptadores de vídeo de nivel de característica 11.1 y WDDM 1.2 (modelo de controlador de pantalla a partir de Windows 8) controladores y ya se admiten en niveles de características de 10level9.

³DXGI 1.2 introdujo el formato 4:4:4:4.4. Este formato es opcionalmente compatible con el entorno de ejecución de DirectX 11.1, que es necesario para los adaptadores de vídeo de nivel de característica 11.1 y los controladores WDDM 1.2 y ya se admiten en niveles de características de 10level9.

En el caso de los formatos sin comprimir, DXGI ha limitado la compatibilidad con patrones arbitrarios de formato de píxeles; todos los formatos sin comprimir deben ser de tipo RGBA. Esto puede requerir el giro de los formatos de píxeles de recursos existentes, que se recomienda calcular como un paso previo al proceso sin conexión siempre que sea posible.

Migración de sombreadores

Los sombreadores de Direct3D 10 están creados en HLSL

Direct3D 10 limita el uso del lenguaje de ensamblado solo al de fines de depuración, por lo que los sombreadores de ensamblado escritos a mano usados en Direct3D 9 deberán convertirse a HLSL.

Firmas y vinculación del sombreador

Hemos analizado los requisitos para la vinculación del ensamblado de entrada a firmas de entrada del sombreador de vértices anteriormente en este documento (consulte más arriba). Tenga en cuenta que el tiempo de ejecución de Direct3D 10 también ha ajustado los requisitos para la vinculación de fase a fase entre sombreadores. Este cambio afectará a los orígenes del sombreador en los que es posible que el enlace entre fases no se haya descrito completamente en Direct3D 9. Por ejemplo:

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 roto - Vinculación ps - aunque el sombreador de píxeles puede no estar interesado en la matriz completa, la vinculación debe especificar el float4x3 completo.

Tenga en cuenta que la semántica de vinculación entre fases debe coincidir exactamente, sin embargo, las entradas de las fases de destino pueden ser un prefijo de los valores que se generan. En el ejemplo anterior, el sombreador de píxeles podría tener posición y texcoord1 como las únicas entradas, pero no podía tener la posición y texcoord2 como las únicas entradas debido a las restricciones de ordenación.

Vínculos de fase de sombreador de HLSL

La vinculación entre sombreadores puede producirse en cualquiera de los siguientes puntos de la canalización:

  • Ensamblador de entrada a sombreador de vértices
  • Sombreador de vértices a sombreador de píxeles
  • Sombreador de vértices en sombreador de geometría
  • Sombreador de vértices para transmitir la salida
  • Sombreador de geometría a sombreador de píxeles
  • Sombreador de geometría que se va a transmitir

Búferes de constantes

Para facilitar la portabilidad de contenido de Direct3D 9, un enfoque inicial para la administración constante fuera del sistema Efectos puede implicar la creación de un único búfer de constantes que contenga todas las constantes necesarias. Es importante que el rendimiento ordene constantes en búferes por la frecuencia esperada de actualización. Esta organización reducirá la cantidad de conjuntos de constantes redundantes en un mínimo.

Planos clip de usuario en HLSL en el nivel de característica 9 y versiones posteriores

A partir de Windows 8, puede usar el atributo de función clipplanes en una declaración de función HLSL en lugar de SV_ClipDistance para que el sombreador funcione en el nivel de característica 9_x, así como en el nivel de característica 10 y versiones posteriores. Para obtener más información, consulta Planos de clip de usuario en hardware de nivel de característica 9.

Diferencias adicionales de Direct3D 10 para observar

Enteros como entrada

En Direct3D 9, no había compatibilidad de hardware real con tipos de datos enteros, pero el hardware de Direct3D 10 admite tipos enteros explícitos. Si tiene datos de punto flotante en el búfer de vértices, debe tener una entrada float. De lo contrario, un tipo entero será la representación de patrón de bits del valor de punto flotante. No se permite un tipo entero para una entrada de sombreador de píxeles a menos que el valor esté marcado para no interpolación (vea Modificadores de interpolación).

Cursores del mouse

En versiones anteriores de Windows, las rutinas estándar de cursor del mouse GDI no funcionaban correctamente en todos los dispositivos exclusivos de pantalla completa. Se agregaron las API SetCursorProperties, ShowCursor y SetCursorPosition para controlar estos casos. Dado que la versión de GDI de Windows Vista comprende completamente las superficies DXGI , no es necesario esta API de cursor de mouse especializada, por lo que no hay ningún equivalente de Direct3D 10. En su lugar, las aplicaciones de Direct3D 10 deben usar las rutinas estándar del cursor del mouse GDI para cursores de mouse.

Asignar elementos de textura a píxeles en Direct3D 10

En Direct3D 9, los centros de elementos de textura y los centros de píxeles estaban separados por la mitad de unidad (consulta Asignar elementos de textura directamente a píxeles (Direct3D 9)). En Direct3D 10, los centros de elementos de textura ya están en unidades medias, por lo que no es necesario desplazar las coordenadas del vértice en absoluto.

La representación de quads de pantalla completa es más sencilla con Direct3D 10. Los quads de pantalla completa deben definirse en el espacio de clips (-1,1) y simplemente pasar por el sombreador de vértices sin cambios. De este modo, no es necesario volver a cargar el búfer de vértices cada vez que cambia la resolución de pantalla y no hay ningún trabajo adicional en el sombreador de píxeles para manipular las coordenadas de textura.

Cambios de comportamiento de recuento de referencias

A diferencia de las versiones anteriores de Direct3D, las distintas funciones Set no contendrán una referencia a los objetos de los dispositivos. Esto significa que la aplicación debe asegurarse de que contiene una referencia en el objeto mientras quiera que ese objeto esté enlazado a la canalización. Cuando el recuento de referencias del objeto cae a cero, el objeto se desenlazará de la canalización a medida que se destruye. Este estilo de retención de referencia también se conoce como retención de referencia débil, por lo que cada ubicación de enlace del objeto Device contiene una referencia débil al objeto interface/. A menos que se mencione explícitamente lo contrario, se debe asumir este comportamiento para todos los métodos Set. Cada vez que la destrucción de un objeto hace que un punto de enlace se establezca en NULL , la capa de depuración emitirá una advertencia. Tenga en cuenta que las llamadas a los métodos Get del dispositivo, como OMGetRenderTargets , aumentarán el número de referencias de objetos que se devuelven.

Nivel cooperativo de prueba

La funcionalidad de la API de Direct3D 9 TestCooperativeLevel es análoga a establecer el DXGI_PRESENT_TEST al llamar a Present.

StretchRect

Una función similar al método IDirect3D 9 IDirect3DDevice9::StretchRect no está disponible en Direct3D 10 y 10.1. Para copiar superficies de recursos, use ID3D10Device::CopySubresourceRegion. Para cambiar el tamaño de las operaciones, represente en una textura mediante el filtrado de texturas. Para convertir superficies de MSAA en superficies que no son de MSAA, use ID3D10Device::ResolveSubresource.

Diferencias adicionales de Direct3D 10.1

Windows Vista con Service Pack 1 (SP1) incluía una actualización secundaria de Direct3D 10 y Direct3D 10.1, que expone las siguientes características de hardware adicionales:

  • Sombreadores por muestra de MSAA
  • Lectura de profundidad de MSAA
  • Modos de combinación independientes por destino de representación
  • Matrices de mapa de cubos
  • Representación en formatos comprimidos por bloques (BC)

La actualización de Direct3D 10.1 agregó compatibilidad con las siguientes interfaces nuevas, que se derivan de las interfaces existentes:

La actualización de Direct3D 10.1 también incluía las siguientes estructuras adicionales:

La API de Direct3D 10.1 incluye un nuevo concepto denominado nivel de característica. Este concepto significa que puedes usar la API de Direct3D 10.1 para controlar el hardware de Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) o Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1). Dado que la API de Direct3D 10.1 se deriva de las interfaces de Direct3D 10, las aplicaciones pueden crear un dispositivo Direct3D 10.1 y, a continuación, usarlo como dispositivo Direct3D 10.0, excepto cuando se necesiten nuevas características específicas de 10.1 (siempre que el nivel de característica de D3D10_FEATURE_LEVEL_10_1 esté presente y admita estas características).

Nota

Los dispositivos Direct3D 10.1 pueden usar los perfiles de sombreador HLSL 10.0 existentes (vs_4_0, ps_4_0, gs_4_0) y los nuevos perfiles 10.1 (vs_4_1, ps_4_1, gs_4_1) con instrucciones y funcionalidades adicionales de HLSL.

 

Windows 7 contenía una actualización secundaria de la API de Direct3D 10.1 que se incluye en el entorno de ejecución de Direct3D 11. Esta actualización agrega compatibilidad con los siguientes niveles de características:

Windows 7 también ha agregado compatibilidad con Direct3D 10.1 para la Plataforma de rasterización avanzada de Windows (WARP). Puede especificar un controlador WARP mediante D3D10_DRIVER_TYPE_WARP.

Para obtener más información sobre Direct3D 10.1, consulta Características de Direct3D 10.1 y la enumeración D3D10_FEATURE_LEVEL1 .

Guía de programación para Direct3D 10