David Catuhe
Utilisation de la technologie DirectX Managed, Partie 4/9
Avant de nous enfoncer plus avant dans les méandres de DirectX Managed, il est un point que nous devons éclaircir afin de pouvoir considérer notre app
Par David Catuhe publié le 09/01/2005 à 23:07, lu 8140 fois, 4 pages
 3 | DirectX SDK Updates
Téléchargez le code source - 27 Kb
Portabilité
DirectX Managed fournit en standard une classe qui va nous permettre d'évaluer à la volée les capacités de la carte graphique active. Ces capacités sont fournies par le fabricant de la carte graphique et peuvent être directement consultées en utilisant le CapsViewer qui est un utilitaire fourni en standard avec le SDK de DirectX.



Chaque fonctionnalité supportée par DirectX et potentiellement pris en charge par la carte graphique possède une entrée dans une structure appelée Caps. C'est le contenu de cette structure qui est affiché par le Caps Viewer. Sur la capture d'écran ci-dessus, il est par exemple possible de voir que la carte graphique installée supporte des textures avec des résolutions allant jusqu'à 4096 par 4096.
De la même manière dans le code de notre application nous allons pouvoir, à chaque fois qu'une option graphique devra être activée, savoir si cette dernière est supportée ou non par le matériel.
Pour interroger le driver nous allons faire appel à la classe Manager qui intègre toutes les méthodes nécessaires. Ainsi, lors du lancement de l'application, nous allons activer le traitement mathématique des objets par la carte graphique (TnL : Transform and Lighting) si cela est possible et sinon nous opterons pour une solution où les calculs seront faits par le processeur central :
Caps caps = Manager.GetDeviceCaps(0, DeviceType.Hardware);

if (caps.DeviceCaps.SupportsHardwareTransformAndLight)
    device3D = new Device(0, DeviceType.Hardware, ctrl, CreateFlags.HardwareVertexProcessing, presentParams);
else
    device3D = new Device(0, DeviceType.Hardware, ctrl, CreateFlags.SoftwareVertexProcessing, presentParams);
Comme nous pouvons le constater ici, le Manager nous retourne une structure de type Caps qui contient un ensemble de valeurs définissant la carte graphique et notamment sa capacité à faire les calculs de transformations géométriques.
De la même manière, il est possible de demander la validation de chacune des options supportées par DirectX. Il suffit pour cela d'aller chercher la valeur associée dans la structure Caps :
if (caps.MaxActiveLights < 2)
    ErrorManage("Votre carte ne supporte pas assez de lumires...");

if (caps.MaxTextureBlendStages < 2)
    ErrorManage("Votre carte ne supporte pas le multitexturing...");

if (caps.RasterCaps.SupportsAnisotropy)
    ErrorManage("Votre carte ne supporte pas le filtrage anisotropique...");
Une bonne rigueur de programmation est nécessaire dans notre cas, car il ne faut pas laisser d'options actives sans avoir au préalable effectuer les vérifications opportunes.
Ainsi un autre point clé de notre programme va devoir subir les foudres de la validation par le Manager. En effet, lors du lancement de notre application nous avons pour le moment présumé du format de notre buffer de travail et de notre ZBuffer. Si dans la majorité des cas les valeurs sélectionnées ne poseront pas de problème nous devons toutefois mettre en place un mécanisme plus robuste qui va a nouveau s'appuyer sur le Manager au travers de deux de ses méthodes : CheckDeviceType et CheckDepthStencilMatch :
private static DepthFormat GetDepthFormat(Format backbufferFormat)
{
    if (Manager.CheckDepthStencilMatch(0,
                                       DeviceType.Hardware,
                                       Manager.Adapters[0].CurrentDisplayMode.Format,
                                       backbufferFormat,
                                       DepthFormat.D24X8))
        return DepthFormat.D24S8;

    return DepthFormat.D15S1;
}

private static Format GetBackBufferFormat()
{
    if (Manager.CheckDeviceType(0,
                                DeviceType.Hardware,
                                Manager.Adapters[0].CurrentDisplayMode.Format,
                                Format.X8R8G8B8,
                                true))
        return Format.X8R8G8B8;
    if (Manager.CheckDeviceType(0,
                                DeviceType.Hardware,
                                Manager.Adapters[0].CurrentDisplayMode.Format,
                                Format.R5G6B5,
                                true))
        return Format.R5G6B5;

    return Format.Unknown;
}

public static void InitDXM(Control ctrl)
{
    try
    {
        PresentParameters presentParams = new PresentParameters();

        presentParams.Windowed = true;
        presentParams.SwapEffect = SwapEffect.Discard;
        presentParams.BackBufferFormat = GetBackBufferFormat();
        presentParams.AutoDepthStencilFormat = GetDepthFormat(presentParams.BackBufferFormat);
        presentParams.EnableAutoDepthStencil = true;
        presentParams.BackBufferCount = 2;
En respectant cette petite contrainte de validation, nous pouvons donc nous garantir une portabilité maximale même vers du matériel à venir ou totalement dépassé.
 
» Démarrer une discussion