Question

J'essaie de dessiner une image 2D sur l'écran dans Direct3D, ce qui, je suppose, doit être effectué en mappant une texture sur un polygone d'affichage rectangulaire projeté pour remplir l'écran. (Je ne suis pas intéressé ou je ne peux pas utiliser Direct2D.) Toutes les informations de texture trouvées dans le SDK décrivent le chargement d'une image bitmap à partir d'un fichier et l'attribution d'une texture pour utiliser cette image, mais je n'ai pas encore trouvé le moyen de le manipuler. une texture sous forme de bitmap pixel par pixel.

Ce que j'aimerais vraiment, c'est une fonction telle que

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

Si je ne peux pas définir les pixels directement dans l'objet texture, dois-je conserver un tableau DWORD qui correspond au bitmap, puis attribuer la texture à chaque image?

Enfin, bien que je suppose au départ que je le ferai sur le processeur, les calculs de couleur par pixel pourraient probablement également être effectués sur le GPU. Le code HLSL définissant la couleur d’un seul pixel dans une texture ou les shaders de pixels sont-ils utiles uniquement pour modifier les pixels de l’affichage?

Merci.

Était-ce utile?

La solution

D'abord, votre question directe:

Techniquement, vous pouvez définir des pixels dans une texture. Cela nécessiterait l’utilisation de LockRect et API UnlockRect .

Dans le contexte D3D, le terme "verrouillage" désigne généralement le transfert d'une ressource de la mémoire du processeur graphique vers la mémoire système (désactivant ainsi sa participation aux opérations de rendu). Une fois verrouillé, vous pouvez modifier le tampon rempli à votre guise, puis déverrouiller, c'est-à-dire transférer les données modifiées vers le GPU. En règle générale, le verrouillage était considéré comme une opération très coûteuse, mais depuis PCIe 2.0 , ce qui est probablement pas une préoccupation majeure plus. Vous pouvez également spécifier un petit RECT (même 1 pixel) comme second argument de LockRect, nécessitant ainsi le transfert en mémoire d'un volume de données négligeable, et en espérant que le pilote est suffisamment intelligent pour le transférer (je sais pertinemment cela n’était pas le cas chez les anciens pilotes nVidia).

Le moyen le plus efficace (et le plus gourmand en code) pour y parvenir est en effet de ne jamais quitter le GPU. Si vous créez votre texture en tant que RenderTarget ( c’est-à-dire, spécifiez D3DUSAGE_RENDERTARGET comme argument d'utilisation ), vous pouvez ensuite le définir comme destination du pipeline avant de lancer des appels de tirage et écrire un shader (peut-être paramètres de passage ) pour peindre vos pixels. Une telle utilisation des cibles de rendu est considérée comme standard et vous devriez pouvoir trouver de nombreux exemples de code, mais à moins que vous ne rencontriez déjà des problèmes de performances, je dirais que ce serait une surpopulation pour un seul panneau d'affichage 2D.

HTH.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top