Правильный контроль для рендеринга в UWP - PullRequest
0 голосов
/ 17 января 2019

Я работаю над реализацией своего собственного алгоритма 3D-рендеринга, который в конечном итоге выведет 2D-набор «пикселей», где каждый пиксель является значением RGB. Это может выглядеть примерно так:

int pixels[][]

Какой элемент управления XAML я бы использовал для отображения этих данных A) в виде статического изображения и B) в режиме реального времени?

Моя первоначальная идея в отношении статического изображения состояла в том, чтобы вывести мои данные в виде растрового изображения, а затем с помощью элемента управления Image установить источник для этого растрового изображения. Так что это может выглядеть примерно так:

int pixels[][] = renderer.Render(sceneData);
Bitmap image = new Bitmap(pixels);
MyImageControl.Source = image;

Это жизнеспособно? Какой правильный класс для «растрового изображения»? Мне трудно найти один. Я хочу иметь возможность индивидуально манипулировать значениями пикселей.

По второму вопросу, в режиме реального времени, просто помещается тот же код, что и выше, но в цикл, выполняемый (в идеале) от 30 до 60 или более раз в секунду, и результат будет больше похож на видео, чем на один неподвижное изображение. Судя по моему прошлому опыту UWP и C #, повторная установка свойства Source элемента управления Image будет слишком медленной для этого.

Я могу использовать существующие API для таких вещей, как обработка данных изображения, отображение их или преобразование их форматов, но цель этого упражнения для меня - написать собственный рендерер ... поэтому мне нужно перевести входные данные в окончательный набор "пикселей" сам. Я не могу использовать DirectX или другие существующие средства визуализации для этого.

1 Ответ

0 голосов
/ 17 января 2019

Для вас 1-е требование,

Каков правильный класс для «растрового изображения»?

Пробовал ли вы с CanvasBitmap?Он имеет статические методы, такие как:

CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat);

вы должны использовать Byte[] вместо int[] для информации о цвете, что логично.

У него также есть метод для получения необработанного пикселяdata:

public byte[] GetPixelBytes()

Я хочу иметь возможность индивидуально манипулировать значениями пикселей.

CanvasBitmap также имеет эти методы для прямой установки данных пикселей (из документа:):

  1. SetPixelBytes(Byte[]) Устанавливает байтовые данные растрового изображения из указанного массива.

  2. SetPixelBytes(IBuffer) Устанавливает байтовые данныебитовое изображение из указанного буфера.

  3. SetPixelBytes(Byte[], Int32, Int32, Int32, Int32) Устанавливает байтовые данные субрегиона растрового изображения.

  4. SetPixelBytes(IBuffer, Int32, Int32, Int32, Int32) Устанавливает байтданные субрегиона растрового изображения из указанного буфера.

Для вашего второго требования:

Вам нужно показывать видео в реальном времени?Или просто создать видео?Существует решение для создания видео, но не для живого показа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...