2009-05-08 7 views
2

Je suis en train de coder une application 3D avec DirectX 10 et je me demande comment est le tackeling de la Shadermanagement.Direct3D 10 et la gestion des shaders

Est-il plus efficace de précharger tous les shaders au démarrage de l'application, puis de les utiliser au besoin ou cela entraîne-t-il les ressources matérielles si le nombre augmente?

Aussi je me demande si c'est une considération de vitesse pour commander le rendu par shader ainsi les commutateurs de shader sont minimisés.

Répondre

2

Je n'ai pas travaillé avec DX10, seulement DX9, mais je suppose que ces choses sont toujours les mêmes. En fonction de votre application, vous pouvez générer des shaders lors de l'exécution (de nombreux jeux 3D sophistiqués actuels le font).

Le préchargement des shaders n'est pas une mauvaise idée, selon que vous générez des shaders, combien y en a, quelles sont vos considérations en matière de mémoire - cela dépend. Cependant, le préchargement d'un shader (par lequel je suppose que vous voulez créer l'instance ID3DXEffect) ne prend que de la mémoire au moment de l'exécution, pas d'utilisation du processeur.

La commande par shader est une bonne idée. En général, le tri par matériau est une bonne idée, car le changement de shaders implique des frais généraux (pas excessivement, mais visibles en fonction de la complexité de votre application).

Pour trier vos drawcalls, lisez ceci: http://realtimecollisiondetection.net/blog/?p=86

1

En D3D10, toutes les ressources de l'appareil sont virtualisés de sorte que vous ne manquerez pas d'eux. Bien sûr, vous pouvez toujours épuiser les ressources physiques sur la carte et causer beaucoup de débordement si vous ne faites pas attention à ce que vous faites.

En outre, ils ont considérablement changé l'état de l'appareil pour réduire le coût de l'état de commutation, y compris les shaders.

Mais ce que vous demandez vraiment, c'est "la méthode X est-elle plus rapide que la méthode Y pour mon application?" et bien que D3D10 simplifie la gestion d'état pour rendre l'état de commutation plus rapide, la seule façon de répondre à la question ci-dessus est de faire une mesure de performance avec votre application et vos données.

Le blog de realtimecollectiondetection.net parle uniquement de trier vos appels de tirage. Cela va conduire à moins de changement d'état. Peu importe à quel point la commutation d'état est rapide, en faire moins est toujours plus rapide. C'est donc un bon conseil général.

Questions connexes