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 pasar más allá de Direct3D 10 a Direct3D 11, consulta Migración a Direct3D 11.
- Introducción a los principales cambios estructurales en Direct3D 10
- Abstracciones de motor/separación
- Trucos para resolver rápidamente problemas de compilación de aplicaciones
- Conducción de la API de Direct3D 10
- Creación de recursos
- Vistas
- Acceso a recursos estáticos frente a dinámicos
- Efectos de Direct3D 10
- HLSL sin efectos
- Compilación del sombreador
- Creación de recursos de sombreador
- Interfaz de la capa de reflexión del sombreador
- Diseños del ensamblador de entrada: sombreador de vértices/vinculación de flujo de entrada
- Impacto de la eliminación de código fallido del sombreador
- Ejemplo de estructura de entrada del sombreador de vértices
- Creación de objetos de estado
- Texturas de portabilidad
- Migración de sombreadores
- Diferencias adicionales de Direct3D 10 para observar
- Diferencias adicionales de Direct3D 10.1
- Temas relacionados
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értices en Direct3D 9)
- Declarar topología primitiva
- Establecimiento de texturas
- Establecer objetos de estado
- Establecer sombreadores
- Draw
La llamada draw vincula las operaciones; 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 del sombreador (entradas y salidas a sombreadores) entre fases
- Los cambios en el nombre del punto de entrada de 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 explícitas del sombreador 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 de 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. Por este motivo, es probable que tenga que crear un sombreador de emulación FF o un conjunto de sombreadores que proporcionen los comportamientos de reemplazo necesarios.
Esta documentación contiene notas del producto que contienen 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 cero 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 los 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 de motor/separación
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 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 resulta ú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 ejemplo de comentarios estándar de una sola línea o de bloque de inicio que podrían usarse para este trabajo.
Elemento | Descripción |
---|---|
Direct3D 10 QUITADO |
Use esta opción en la que se quitan 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. El uso intensivo de assert(false) también debe usarse donde se produce \\ Direct3D 10 NEEDS UPDATE para asegurarse de que no se ejecuta el código errante sin saberlo. |
Cambio de Direct3D 10 |
Las áreas en las que se han producido cambios importantes deben mantenerse para futuras referencias, pero comentadas |
// Direct3D 10 END |
Calificador de bloque de código final |
Para varias líneas de origen, debe usar los comentarios de estilo C /* */ pero agregue los comentarios de inicio y finalización pertinentes en torno a estas áreas.
Trucos para resolver rápidamente problemas de compilación de aplicaciones
- Invalidación de tipos de Direct3D 9
- Resolución de problemas de vínculo
- Simulación de CAP de dispositivo
Invalidación de tipos de Direct3D 9
Puede ser útil insertar un archivo de encabezado de alto nivel que contenga definiciones de tipos o invalidaciones 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 general de la versión que describen las 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 de esto incluyen:
typedef ID3D10TextureCube IDirect3DCubeTexture;
typedef ID3D10Texture3D IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT D3DVIEWPORT;
typedef ID3D10VertexShader IDirect3DVertexShader;
typedef ID3D10PixelShader IDirect3DPixelShader;
Resolución de problemas de vínculo
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 dependa 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 (al igual que con el SDK de plataforma de Server 2003 SP1) en la siguiente biblioteca: BufferOverflowU.lib es necesario para resolver los problemas del vinculador de comprobación de buffer_security.
Simulación de CAP de dispositivo
Muchas aplicaciones contienen áreas de código que dependen de los datos CAPS del dispositivo que están disponibles. Para solucionarlo, invalide la enumeración de dispositivos y obligue a capS del dispositivo a valores razonables. Planee volver a visitar las áreas en las que hay 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
- Vistas
- Acceso a recursos estáticos frente a dinámicos
- Efectos de Direct3D 10
- HLSL sin efectos
- Compilación del sombreador
- Creación de recursos de sombreador
- Interfaz de la capa de reflexión del sombreador
- Diseños del ensamblador de entrada: sombreador de vértices/vinculación de flujo de entrada
- Impacto de la eliminación de código fallido del sombreador
- Ejemplo de estructura de entrada del sombreador de vértices
- Creación de objetos de estado
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 omnipresente 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úfer de índices, 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 que se usa para 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, consulte 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
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 en torno al punto de diseño Create, Lock, Fill, Unlock de Direct3D 9, puede aplazar el rellenado desde El momento de creación mediante un recurso de almacenamiento provisional y el método UpdateSubResource en la interfaz de recursos.
Efectos de Direct3D 10
El uso del sistema De efectos de Direct3D 10 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 detalles sobre su uso.
HLSL sin efectos
La canalización de sombreador de Direct3D 10 se puede controlar sin el uso del sistema De efectos de Direct3D 10. Tenga en cuenta que en esta instancia, toda la aplicación debe administrar todos los búferes de constantes, sombreador, muestreador y enlace de textura. Consulte el vínculo de ejemplo y las secciones siguientes de este documento para obtener más detalles:
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 funcionar en dos modos. Para obtener compatibilidad completa con las funciones intrínsecas y la semántica de estilo direct3D 9, se debe invocar la compilación mediante la marca COMPATIBILITY MODE que se puede especificar por compilación.
El modelo de sombreador 4.0 semántica específica del 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 el mayor aviso 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 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 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 la versión más reciente de HLSL Fxc.exe compilador de línea de comandos y las API 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, consulta Usar sombreadores en Direct3D 10.
Interfaz de la 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 resulta 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 proporciona 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/vinculación de flujo de entrada
El ensamblador de entrada (IA) reemplaza la declaración de secuencia de vértices 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 la 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 en los que la firma de entrada del sombreador coincide con la del sombreador usado 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 del sombreador y crear las instancias del objeto de diseño ia lo antes posible y reutilizarlas siempre que sea posible.
Impacto de la eliminación de código fallido del sombreador
En la sección siguiente 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 no válido de Direct3D 9 quitaría la declaración en el sombreador debido a la eliminación condicional de código fallido
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, por lo que puede atravesar los requisitos de entrada del sombreador y asegurarse de proporcionar una descripción completa del flujo de entrada a 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, ¶mDesc);
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 el estado 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.
Texturas de portabilidad
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 de lo que hicieron en Direct3D 9:
Formato de archivo | Direct3D 9 | Direct3D 10 |
---|---|---|
.bmp | sí | sí |
.jpg | sí | sí |
.tga | sí | |
.png | sí | sí |
.dds | sí | sí |
.ppm | sí | |
.Dib | sí | |
.Hdr | sí | |
.pfm | sí | |
.tiff | sí | |
.gif | sí | |
TIF | sí |
Para obtener más información, compare las enumeraciones de direct3D 9 D3DXIMAGE_FILEFORMAT con las enumeraciones de 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 direct3D 9 | Formato direct3D 10 |
---|---|
D3DFMT_UNKNOWN | DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 | No disponible |
D3DFMT_A8R8G8B8 | DXGI_FORMAT_B8G8R8A8_UNORM y DXGI_FORMAT_B8G8R8A8_UNORM_SRGB¹ |
D3DFMT_X8R8G8B8 | DXGI_FORMAT_B8G8R8X8_UNORM y 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 y 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 rojo en otros componentes para obtener el comportamiento D3D9. |
D3DFMT_A8L8 | DXGI_FORMAT_R8G8_UNORM Nota: Use swizzle .rrrg en el sombreador para duplicar el 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 y DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 | DXGI_FORMAT_BC1_UNORM y DXGI_FORMAT_BC1_UNORM_SRGB Nota: DXT1 y DXT2 son los mismos desde una perspectiva de API/hardware... solo la diferencia era "alfa premultipado", que una aplicación puede realizar el seguimiento y no necesita un formato independiente. |
D3DFMT_DXT3 | DXGI_FORMAT_BC2_UNORM y DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 | DXGI_FORMAT_BC2_UNORM y DXGI_FORMAT_BC2_UNORM_SRGB Nota: DXT3 y DXT4 son los mismos desde una perspectiva de API/hardware... solo la diferencia era "alfa premultipado", que una aplicación puede realizar el seguimiento y no necesita un formato independiente. |
D3DFMT_DXT5 | DXGI_FORMAT_BC3_UNORM y DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 y 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 rojo en otros componentes para obtener el comportamiento 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 floats enteros de estilo Direct3D 9 (0.0f, 1.0f... 255.f), UINT se puede convertir a float32 en sombreador. |
D3DDECLTYPE_SHORT2 | DXGI_FORMAT_R16G16_SINT Nota: El sombreador obtiene valores SINT, pero si se necesitan elementos flotantes 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 floats enteros de estilo Direct3D 9, SINT se puede convertir a float32 en 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 windows Display Driver Model (WDDM) para Windows Vista (WDDM 1.0). Considere la posibilidad de usar DXGI_FORMAT_R8G8B8A8_UNORM en su lugar. Como alternativa, puede crear el dispositivo con D3D10_CREATE_DEVICE_BGRA_SUPPORT para asegurarse de que solo admite 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) y ya se admiten en niveles de características de 10level9.
³DXGI 1.2 introdujo el formato 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.
Para 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 se crean en HLSL
Direct3D 10 limita el uso del lenguaje de ensamblado a los fines de depuración únicamente, por lo que los sombreadores de ensamblado escritos a mano usados en Direct3D 9 deberán convertirse en HLSL.
Firmas y vinculación del sombreador
Hemos analizado los requisitos para la vinculación de 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 - PS Vinculación - aunque el sombreador de píxeles no esté 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 están generando. 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.
Vinculación de fase de sombreador de HLSL
La vinculación entre sombreadores puede producirse en cualquiera de los puntos siguientes de la canalización:
- Ensamblador de entrada en 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 para transmitir por secuencias
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 según la frecuencia esperada de actualización. Esta organización reducirá la cantidad de conjuntos de constantes redundantes a un mínimo.
Planos de clip de usuario en HLSL en el nivel de característica 9 y versiones posteriores
A partir de Windows 8, puedes 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 superior. Para obtener más información, vea 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 del sombreador de píxeles a menos que el valor esté marcado para ninguna interpolación (vea Modificadores de interpolación).
Cursores del mouse
En versiones anteriores de Windows, las rutinas estándar del cursor del mouse GDI no funcionaban correctamente en todos los dispositivos exclusivos de pantalla completa. Las API SetCursorProperties, ShowCursor y SetCursorPosition se agregaron para controlar estos casos. Dado que la versión de GDI de Windows Vista comprende completamente las superficies DXGI , no hay necesidad de esta API especializada de cursor del mouse, 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 los cursores del mouse.
Asignación de 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 unidades (consulte Asignaciones directas de elementos de textura a píxeles (Direct3D 9)). En Direct3D 10, los centros de textura ya están en unidades medias, por lo que no es necesario cambiar 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 siempre que 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/object. 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 out, 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 recuento de referencias de los objetos que se devuelven.
Probar el nivel cooperativo
La funcionalidad de la API TestCooperativeLevel de Direct3D 9 es análoga a establecer el DXGI_PRESENT_TEST al llamar a Present.
StretchRect
Una función similar al método Direct3D 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 a 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 mezcla 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 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ísticas. Este concepto significa que puedes usar la API de Direct3D 10.1 para impulsar 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 donde se necesitan nuevas características específicas de 10.1 (siempre que el nivel de características 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 (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, consulte Características de Direct3D 10.1 y la enumeración D3D10_FEATURE_LEVEL1.
Temas relacionados