Effectuer une relecture à partir de textures et de surfaces Direct3D
J'ai besoin de comprendre comment obtenir les données de D3D les textures et les surfaces de retour à la mémoire système. Quel est le moyen le plus rapide pour faire de telles choses et comment?
Aussi, si j'ai seulement besoin d'une subrect, comment peut-on lire uniquement la partie sans avoir à lire l'intégralité de la chose à la mémoire système?
En bref, je suis à la recherche pour de brèves descriptions de la façon de copier le code à de la mémoire système:
- un texture
- un sous-ensemble d'un texture
- un surface
- un sous-ensemble d'un surface
- un D3DUSAGE_RENDERTARGET texture
- un sous-ensemble d'un D3DUSAGE_RENDERTARGET texture
C'est Direct3D 9, mais les réponses sur les nouvelles versions de D3D serait appréciée.
source d'informationauteur Baxissimo
Vous devez vous connecter pour publier un commentaire.
Les plus impliqués partie est de la lecture à partir d'une certaine surface, qui est dans la mémoire vidéo ("pool par défaut"). C'est le plus souvent les cibles de rendu.
Let's get le plus facile d'abord:
Alors maintenant, nous avons laissé les surfaces qui sont dans la mémoire vidéo ("pool par défaut"). Ce serait n'importe quelle surface/texture marqué comme cible de rendu, ou n'importe quelle surface/texture que vous avez créé dans le pool par défaut, ou le backbuffer lui-même. Le complexe est ici que vous ne pouvez pas verrouiller.
Réponse courte est: GetRenderTargetData méthode sur D3D device.
Réponds plus (une ébauche du code ci-dessous):
Même plus répondre (dans le coller dans le code, je travaille sur) de la façon suivante. Cette ne compiler hors de la boîte, car il utilise certaines classes, des fonctions, des macros et des utilitaires à partir du reste de la base de code; mais il devrait vous obtenir a commencé. J'ai aussi oublié la plupart de vérification des erreurs (par exemple, si la largeur/hauteur est hors des limites du terrain). J'ai aussi omis la partie qui lit pixels réels et, éventuellement, les convertit en format de destination (c'est assez facile, mais il peut faire de long, selon le nombre de conversions de format que vous souhaitez à l'appui).
SurfacePointer
dans le code ci-dessus est une smart pointeur vers un objet COM (il libère de l'objet sur la cession ou le destructeur). Simplifie la gestion des erreurs beaucoup. Ceci est très similaire à_comptr_t
choses dans Visual C++.Le code ci-dessus se lit arrière sur toute la surface. Si vous voulez lire une partie seulement de manière efficace, alors je crois que la façon la plus rapide est d'environ:
En fait, c'est assez similaire à ce code ci-dessus ne pour gérer les multi-échantillonnés surfaces. Si vous souhaitez obtenir juste une partie d'un multi-échantillonnés surface, vous pouvez faire un multi-échantillons résoudre et obtenir une partie d'une StretchRect, je pense.
Modifier: enlevé un morceau de code qui n'réelle de lecture des pixels et des conversions de format. N'est pas directement reliée à la question, et le code a été long.
Modifier: mise à jour pour correspondre édité question.