XNA: Obtenir une structure en tant que texture sur le GPU
Question
J'utilise XNA comme une base facile et agréable pour certains traitements graphiques que je fais sur le processeur, car il fournit déjà beaucoup de choses dont j'ai besoin. Actuellement, mon & Quot; rendertarget & Quot; est un tableau de couleurs personnalisées struct
que j'ai écrites et composé de trois champs à virgule flottante: R, G, B.
Lorsque je souhaite afficher ce résultat à l'écran, je convertis manuellement ce tableau en couleur Texture2D
fournie par XNA (seulement 8 bits de précision par canal) en bloquant simplement le résultat dans une plage d'octets comprise entre 0 et 255. J'ai ensuite défini ce nouveau tableau en tant que données d'un SurfaceFormat
(il a un SurfaceFormat.Color
sur SpriteBatch
) et restituer la texture avec un StructLayout
.
Ce que je recherche, c’est un moyen de supprimer ce processus de traduction sur le processeur et d’envoyer simplement mon backbuffer directement au GPU sous forme de texture, sur laquelle je souhaite effectuer un post-traitement de base. Et j’ai vraiment besoin d’un peu plus de précision que de 8 bits (pas nécessairement de 32 bits, mais comme ce que je fais ne nécessite pas beaucoup de GPU, je suppose que cela ne peut pas faire mal).
Comment pourrais-je m'y prendre?
Je pensais que si je donnais à Color une taille explicite de 32 octets (donc 8 octets de remplissage, car mes trois canaux ne remplissent que 24 bits) via SurfaceFormat.Vector4
et définissons le SetData<Color>
de la texture rendue avec le < => à VertexDeclaration
(32 octets de grande taille) et a rempli la texture avec <=> que cela fonctionnerait peut-être. Mais je reçois cette exception:
Le type que vous utilisez pour T dans cette méthode est une taille non valide pour cette ressource.
Est-il possible d'utiliser n'importe quelle <=> composition arbitraire et de l'interpréter en tant que données de texture dans le GPU, comme vous pouvez le faire avec des sommets via <=> en précisant la manière dont elle est agencée?
La solution
Je pense avoir ce que je veux en vidant la couleur struct
que j'ai créée et en utilisant Vector4
pour mes informations de couleur. Cela fonctionne si la SurfaceFormat
de la texture est également définie sur <=>.