В ответе Рика рассказывается о методах, которые вы можете использовать, если вам не важно потерять аппаратное ускорение. Я сосредотачиваюсь на том, как добиться этого, используя значительное ускорение графического процессора.
Чтобы ускорить работу вашего оборудования рендеринга и добиться максимальной производительности, вы захотите переключиться с ID2DHwndRenderTarget на использование более новых интерфейсов ID2DDevice и ID2DDeviceContext. Честно говоря, это не добавляет намного больше логики вашему коду, а преимущества производительности значительны. Он также работает в Windows 7 с обновлением платформы. Подводя итог процесса:
- Создание фабрики DXGI при создании фабрики D2D.
- Создание устройства D3D11 и устройства D2D для сопоставления.
- Создайте цепочку обмена, используя фабрику DXGI и устройство D3D.
- Попросите в цепочке подкачки задний буфер и оберните его в растровое изображение D2D.
- Рендеринг как и раньше, между вызовами BeginDraw () и EndDraw (). Не забудьте отсоединить задний буфер и уничтожить растровое изображение D2D, оборачивая его!
- Вызовите Present () в цепочке обмена, чтобы увидеть результаты.
- Повторите с 4.
Как только вы это сделаете, вы разблокировали несколько возможных решений. Вероятно, самый простой и эффективный способ решения вашей точной проблемы (замена цветовых каналов) - это использовать эффект цветовой матрицы в качестве одного из других упомянутых ответов. Важно понимать, что вам нужно использовать более новый интерфейс ID2DDeviceContext, а не ID2DHwndRenderTarget, чтобы получить это, однако. Есть много других эффектов, которые могут выполнять более сложные операции, если вы того пожелаете. Вот некоторые из наиболее полезных для простой манипуляции с пикселями:
Для общего решения проблемы манипулирования пикселями напрямую, без снижения аппаратного ускорения или тонны копирования, есть два варианта. Первый - написать пиксельный шейдер и обернуть его полностью настраиваемым D2D-эффектом. Это больше работы, чем просто получение пиксельного буфера на процессоре и выполнение старомодного битового затирания, но делать все это на GPU значительно быстрее. Инфраструктура эффектов D2D также упрощает повторное использование вашего эффекта для других целей, объединение его с другими эффектами и т. Д.
В тех случаях, когда вам абсолютно необходимо манипулировать пикселями процессора, но при этом все еще требуется значительная степень ускорения, вы можете управлять своими собственными отображаемыми текстурами D3D11. Например, вы можете использовать промежуточные текстуры, если хотите асинхронно манипулировать ресурсами текстуры из ЦП. Существует другой ответ , который более подробно описан. См. ID3D11Texture2D для получения дополнительной информации.