J'utilise XNA comme une base facile pour certains traitements graphiques que je fais sur le CPU, car il fournit déjà beaucoup de choses dont j'ai besoin. Actuellement, mon "rendertarget" est un tableau d'une couleur personnalisée struct
J'ai écrit qui se compose de trois champs à virgule flottante: R, G, B.XNA: Obtenir une struct comme une texture pour le GPU
Lorsque je veux rendre cela à l'écran, je convertis manuellement ce tableau à la couleur struct
que fournit XNA (seulement 8 bits de précision par canal) en serrant simplement le résultat dans la plage de 0 à 255 octets. J'ai ensuite mis ce nouveau tableau comme les données d'un Texture2D
(il a un SurfaceFormat
de SurfaceFormat.Color
) et de rendre la texture avec un SpriteBatch
. Ce que je cherche est un moyen de se débarrasser de ce processus de traduction sur le CPU et simplement envoyer mon backbuffer directement au GPU comme une sorte de texture, où je veux faire un post-traitement de base. Et j'ai vraiment besoin d'un peu plus de précision que 8 bits là-bas (pas forcément 32 bits, mais vu que ce que je fais n'est pas gourmant en GPU, ça ne peut pas faire de mal je suppose).
Comment ferais-je cela?
Je pensais que si je donnais couleur une taille explicite de 32 octets (donc 8 octets de padding, parce que mes trois canaux ne remplissent que 24 bits) par StructLayout
et régler la SurfaceFormat
de la texture qui est rendu avec le SpriteBatch
-SurfaceFormat.Vector4
(32 octets de large) et rempli la texture avec SetData<Color>
que cela fonctionnerait peut-être. Mais j'ai 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 tout arbitraire composé struct
et l'interpréter comme données de texture dans le GPU comme vous pouvez avec des sommets à travers VertexDeclaration
en spécifiant la façon dont il est disposé?