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
- Abstracciones y separación del motor
- 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 capa de reflexión del sombreador
- Diseños del ensamblador de entrada: sombreador de vértices o 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
- Migración de texturas
- 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é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
- Resolución de problemas de vínculo
- Simulación de CAL de dispositivo
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;
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 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
- 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 capa de reflexión del sombreador
- Diseños del ensamblador de entrada: sombreador de vértices o 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 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
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:
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, ¶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 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 .
Temas relacionados
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de