Choix d’une ressource (Direct3D 10)
Une ressource est une collection de données utilisée par le pipeline 3D. La création de ressources et la définition de leur comportement constituent la première étape de la programmation de votre application. Ce guide couvre des rubriques de base pour le choix des ressources requises par votre application.
- Identifier les étapes de pipeline qui ont besoin de ressources
- Identifier la façon dont chaque ressource sera utilisée
- Liaison de ressources à des phases de pipeline
- Rubriques connexes
Identifier les étapes de pipeline qui ont besoin de ressources
La première étape consiste à choisir la ou les phases de pipeline qui utiliseront une ressource. Autrement dit, identifiez chaque étape qui lit les données d’une ressource, ainsi que les phases qui écrivent les données dans une ressource. Connaître les étapes de pipeline où les ressources seront utilisées détermine les API qui seront appelées pour lier la ressource à la phase.
Ce tableau répertorie les types de ressources qui peuvent être liées à chaque étape de pipeline. Il indique si la ressource peut être liée en tant qu’entrée ou sortie, ainsi que l’API de liaison.
Phase de pipeline | Entrée/Sortie | Ressource | Type de ressource | API de liaison |
---|---|---|---|---|
Assembleur d'entrée | Dans | Tampon de vertex | Buffer | IASetVertexBuffers |
Assembleur d'entrée | Dans | Mémoire tampon d’index | Buffer | IASetIndexBuffer |
Étapes du nuanceur | Dans | Shader-ResourceView | Tampon, Texture1D, Texture2D, Texture3D | VSSetShaderResources, GSSetShaderResources, PSSetShaderResources |
Étapes du nuanceur | Dans | mémoire tampon Shader-Constant | Buffer | VSSetConstantBuffers, GSSetConstantBuffers, PSSetConstantBuffers |
Flux de sortie | Sortie | Buffer | Buffer | SOSetTargets |
Fusion de sortie | Sortie | Affichage cible de rendu | Tampon, Texture1D, Texture2D, Texture3D | OMSetRenderTargets |
Fusion de sortie | Sortie | Vue profondeur/gabarit | Texture1D, Texture2D | OMSetRenderTargets |
Identifier la façon dont chaque ressource sera utilisée
Une fois que vous avez choisi les étapes de pipeline que votre application utilisera (et donc les ressources dont chaque étape aura besoin), l’étape suivante consiste à déterminer la façon dont chaque ressource sera utilisée, c’est-à-dire si une ressource est accessible par le processeur ou le GPU.
Le matériel sur lequel votre application s’exécute aura au moins un processeur et un GPU. Pour choisir une valeur d’utilisation, déterminez le type de processeur qui doit lire ou écrire dans la ressource à partir des options suivantes (voir D3D10_USAGE).
Utilisation des ressources | Peut être mis à jour par | Fréquence de mise à jour |
---|---|---|
Default | GPU | Rarement |
Dynamique | UC | Fréquemment |
Staging | GPU | n/a |
Non modifiable | Processeur (uniquement au moment de la création de la ressource) | n/a |
L’utilisation par défaut doit être utilisée pour une ressource qui est censée être mise à jour par le processeur rarement (moins d’une fois par image). Dans l’idéal, le processeur n’écrit jamais directement dans une ressource avec une utilisation par défaut afin d’éviter les pénalités de performances potentielles.
L’utilisation dynamique doit être utilisée pour une ressource que le processeur met à jour relativement fréquemment (une ou plusieurs fois par image). Un scénario classique pour une ressource dynamique consiste à créer des tampons de vertex et d’index dynamiques qui seraient remplis au moment de l’exécution avec des données sur la géométrie visibles du point de vue de l’utilisateur pour chaque image. Ces mémoires tampons sont utilisées pour afficher uniquement la géométrie visible par l’utilisateur pour ce cadre.
L’utilisation intermédiaire doit être utilisée pour copier des données vers et à partir d’autres ressources. Un scénario classique consiste à copier des données dans une ressource avec une utilisation par défaut (à laquelle le processeur ne peut pas accéder) vers une ressource avec une utilisation intermédiaire (à laquelle le processeur peut accéder).
Les ressources immuables doivent être utilisées lorsque les données de la ressource ne changeront jamais.
Une autre façon d’examiner la même idée consiste à penser à ce qu’une application fait avec une ressource.
Utilisation de la ressource par l’application | Utilisation des ressources |
---|---|
Charger une seule fois et ne jamais mettre à jour | Immuable ou par défaut |
L’application remplit la ressource à plusieurs reprises | Dynamique |
Rendu à la texture | Default |
Accès processeur des données GPU | Staging |
Si vous ne savez pas quelle utilisation choisir, commencez par l’utilisation par défaut, car elle est censée être le cas le plus courant. Une mémoire tampon Shader-Constant est le seul type de ressource qui doit toujours avoir une utilisation par défaut.
Liaison de ressources à des phases de pipeline
Une ressource peut être liée à plusieurs étapes de pipeline en même temps tant que les restrictions spécifiées lors de la création de la ressource (indicateurs d’utilisation, indicateurs deliaison, indicateurs d’accès au processeur) sont remplies. Plus spécifiquement, une ressource peut être liée en tant qu’entrée et sortie simultanément tant que la lecture et l’écriture d’une partie d’une ressource ne peuvent pas se produire en même temps.
Lors de la liaison d’une ressource, réfléchissez à la façon dont le GPU et le processeur accèdent à la ressource. Les ressources conçues dans un seul but (n’utilisent pas plusieurs indicateurs d’utilisation, de liaison et d’accès au processeur) entraînent plus que probablement de meilleures performances.
Par exemple, considérez le cas d’une cible de rendu utilisée comme texture plusieurs fois. Il peut être plus rapide d’avoir deux ressources : une cible de rendu et une texture utilisée comme ressource de nuanceur. Chaque ressource n’utilise qu’un seul indicateur de liaison (D3D10_BIND_RENDER_TARGET ou D3D10_BIND_SHADER_RESOURCE). Les données sont copiées de la texture cible de rendu vers la texture du nuanceur à l’aide de CopyResource ou copySubresourceRegion. Cela peut améliorer les performances en isolant l’écriture de la cible de rendu de la lecture de la texture du nuanceur. Bien sûr, la seule façon d’être sûr est d’implémenter les deux approches et de mesurer la différence de performances dans votre application particulière.
Rubriques connexes