Большие изображения с 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