XNA: Conseguir um struct como uma textura para a GPU
Pergunta
Eu uso XNA como base fácil agradável para alguns de processamento gráfico que estou escrevendo sobre o CPU, porque ele já fornece um monte de coisas que eu preciso. Atualmente, o meu "rendertarget" é uma matriz de um costume cor struct
eu escrevi que consiste em três flutuantes campos de pontos: R, G, B.
Quando eu quero tornar isso na tela, eu converter manualmente essa matriz para o struct
cores que XNA fornece (apenas 8 bits de precisão por canal), basta apertar o resultado dentro do intervalo de bytes de 0-255. Eu, então, definir esta nova matriz como os dados de um Texture2D
(ele tem um SurfaceFormat
de SurfaceFormat.Color
) e tornar a textura com um SpriteBatch
.
O que eu estou procurando é uma maneira de se livrar deste processo de tradução na CPU e simplesmente enviar meu backbuffer diretamente para a GPU como uma espécie de textura, onde eu quiser fazer alguma pós-processamento básico. E eu realmente preciso de um pouco mais precisão do que 8 bits lá (não necessariamente 32-bits, mas desde que eu estou fazendo não é GPU intensivo, não pode ferir eu acho).
Como eu iria fazer isso?
Eu percebi que se eu dei a cores um tamanho explícito de 32 bytes (para 8 bytes de enchimento, porque meus três canais preencher somente 24 bits) através StructLayout
e definir o SurfaceFormat
da textura que é processado com o SpriteBatch
para SurfaceFormat.Vector4
(32 bytes grande) e encheu a textura com SetData<Color>
que seria talvez trabalho. Mas eu recebo esta exceção:
O tipo que você está usando para T neste método é um tamanho inválido para este recurso.
É possível usar qualquer struct
arbitrariamente composta e interpretá-lo como dados de textura na GPU como você pode com vértices através VertexDeclaration
especificando como ele é colocado para fora?
Solução
Eu acho que eu tenho o que eu quero por despejar o struct
Cor eu fiz e usando Vector4
para minha informação de cor. Isso funciona se o SurfaceFormat
da textura também está definido para Vector4
.