Я использую XNA в качестве удобной основы для обработки графики, которую я выполняю на процессоре, потому что он уже предоставляет много всего, что мне нужно. В настоящее время моя "rendertarget" представляет собой массив пользовательского цвета struct
, который я написал, который состоит из трех полей с плавающей точкой: R, G, B.
Когда я хочу отобразить это на экране, я вручную преобразовываю этот массив в цвет struct
, который обеспечивает XNA (только 8 бит точности на канал), просто ограничивая результат в диапазоне байтов 0-255. Затем я устанавливаю этот новый массив как данные Texture2D
(он имеет SurfaceFormat
SurfaceFormat.Color
) и визуализирую текстуру с SpriteBatch
.
То, что я ищу, - это способ избавиться от этого процесса перевода на ЦП и просто отправить свой буфер в буфер непосредственно в виде графического процессора в качестве некой текстуры, где я хочу выполнить некоторую базовую постобработку. И мне действительно нужно немного больше точности, чем 8 битов (не обязательно 32-битных, но, поскольку то, что я делаю, не сильно использует GPU, я думаю, это не повредит)
Как бы я поступил так?
Я подумал, что если бы я дал Цвету явный размер 32 байта (то есть заполнение 8 байтов, потому что мои три канала заполняют только 24 бита) до StructLayout
и установил SurfaceFormat
текстуры, которая отображается с помощью * От 1017 * до SurfaceFormat.Vector4
(размером 32 байта) и залил текстуру SetData<Color>
, чтобы она могла работать. Но я получаю это исключение:
Тип, который вы используете для T в этом методе, является недопустимым размером для этого ресурса.
Можно ли использовать любой произвольно составленный struct
и интерпретировать его как данные текстуры в графическом процессоре, как это можно сделать с вершинами до VertexDeclaration
, указав, как он расположен?