Большие изображения с Direct2D

В настоящее время я занимаюсь разработкой приложения для Магазина Windows, которое выполняет обработку изображений в реальном времени с использованием Direct2D. Он должен поддерживать различные размеры изображений. Первая проблема, с которой я столкнулся, заключается в том, как справиться с ситуациями, когда изображение превышает максимально поддерживаемый размер текстуры. После некоторых исследований и прочтения документации я нашел VirtualSurfaceImageSource в качестве решения. Идея состояла в том, чтобы загрузить изображение как IWICBitmap, а затем создать цель рендеринга с помощью CreateWICBitmapRenderTarget (который, насколько я знаю, не ускоряется аппаратно). После некоторых операций рисования я хотел отобразить результат на экране, аннулировав соответствующую область в источнике VirtualSurfaceImage или когда сработал обратный вызов NeedUpdate. Я предполагал, что это можно сделать, создав ID2D1Bitmap (с аппаратным ускорением) и вызвав CopyFromRenderTarget с целью рендеринга, созданной с помощью CreateWICBitmapRenderTarget и недействительной областью в качестве границ, но в результате метод возвращает D2DERR_WRONG_RESOURCE_DOMAIN. Другой причиной использования IWICBitmap является один из алгоритмов, используемых в приложении, который должен иметь доступ для обновления пикселей изображения.

Вопрос в том, почему эта логика не работает? Это правильный путь для достижения моей цели с помощью Direct2D? Кроме того, поскольку цель рендеринга, созданная с помощью CreateWICBitmapRenderTarget, не ускоряется аппаратно, если я хочу выполнить обработку изображений на графическом процессоре с изображениями, размер которых превышает максимально допустимый размер текстуры, что является лучшим решением?

Заранее спасибо.

1 ответ

Решение

Вы правы, что изображения, размер которых превышает предел текстуры, должны обрабатываться программно.

Однако возникает вопрос: нужно ли вам все это изображение каждый раз, когда вы рендерите.

Вы можете использовать аппаратное ускорение для рендеринга части большого изображения, загруженной в программную цель.

Например,

  • Используйте ID2D1RenderTarget::CreateSharedBitmap, чтобы создать растровое изображение, которое может использоваться различными ресурсами.
  • Затем создайте ID2D1BitmapRenderTarget и визуализируйте в него большое растровое изображение. (обязательно BeginDraw, Clear, DrawBitmap, EndDraw). И растровое изображение, и цель рендеринга могут быть кэшированы для использования последовательными вызовами.
  • Затем скопируйте из этой цели рендеринга в обычный ID2D1Bitmap с частью, которая будет помещаться в память текстур, используя метод ID2D1Bitmap::CopyFromRenderTarget.
  • Наконец, нарисуйте это к реальной цели рендеринга, pRT->DrawBitmap
Другие вопросы по тегам