2009-05-04 6 views
4

J'essaye de dessiner une image 2D à l'écran dans Direct3D, ce que je suppose devoir être fait en mappant une texture à un polygone d'affichage rectangulaire projeté pour remplir l'écran. (Je ne suis pas intéressé ou ne peux pas utiliser Direct2D.) Toutes les informations de texture que j'ai trouvées dans le SDK décrivent le chargement d'un bitmap à partir d'un fichier et l'assignation d'une texture pour utiliser ce bitmap, mais je n'ai pas encore trouvé une texture en bitmap pixel par pixel.Comment définir la couleur d'un seul pixel dans une texture Direct3D?

Ce que je voudrais vraiment est une fonction telle que

void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);

Si je ne peux pas définir les pixels directement dans l'objet de texture, ai-je besoin de garder autour d'un tableau DWORD qui est le bitmap, puis affectez la texture à chaque image?

Enfin, bien que je suppose initialement que je vais le faire sur le processeur, les calculs de couleur par pixel pourraient probablement aussi être effectués sur le GPU. Le code HLSL définit-il la couleur d'un seul pixel dans une texture ou les pixel shaders ne sont-ils utiles que pour modifier les pixels d'affichage?

Merci.

Répondre

4

D'abord, votre question directe:

Vous pouvez, sur le plan technique, mis en pixels dans une texture. Cela nécessiterait l'utilisation de LockRect et UnlockRect API. Dans le contexte D3D, le «verrouillage» fait généralement référence au transfert d'une ressource de la mémoire du GPU vers la mémoire du système (désactivant ainsi sa participation aux opérations de rendu). Une fois verrouillé, vous pouvez modifier le tampon rempli comme vous le souhaitez, puis déverrouiller, c'est-à-dire transférer les données modifiées vers le GPU. Généralement le verrouillage était considéré comme une opération très coûteuse, mais depuis PCIe 2.0 ce n'est probablement plus une préoccupation majeure. Vous pouvez également spécifier un petit RECT (même 1 pixel) comme second argument de LockRect, ce qui nécessite le transfert de mémoire d'un volume de données négligeable, et espère que le pilote est en effet assez intelligent pour transférer juste cela (je sais pertinemment que dans les anciens pilotes nVidia ce n'était pas le cas).

La façon la plus efficace (et intensive en code) d'y parvenir est de ne jamais quitter le GPU. Si vous create your texture en tant que RenderTarget (c'est-à-dire, spécifiez D3DUSAGE_RENDERTARGET comme argument usage), vous pouvez ensuite le définir comme la destination du pipeline avant de faire des appels draw, et écrire un shader (peut-être passing parameters) pour peindre vos pixels. Cette utilisation des cibles de rendu est considérée comme standard, et vous devriez pouvoir trouver de nombreux exemples de code autour - mais à moins que vous ne soyez déjà confronté à des problèmes de performances, je dirais que c'est un surdimensionnement pour un seul panneau 2D.

HTH.

Questions connexes