2009-10-24 14 views
1

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é?

Répondre

2

Je pense que j'ai ce que je veux en vidant la couleur struct que j'ai faite et en utilisant Vector4 pour mes informations de couleur. Cela fonctionne si le SurfaceFormat de la texture est également défini sur Vector4.