Вне экрана (FBO) рендеринг OpenGL для создания кадров для WPF?

У меня есть приложение WPF, и часть экрана показывает объект, который необходимо динамически визуализировать в 3D, возможно, со скоростью 20 FPS. Я понимаю, что обычно приложение WPF использует DirectX для 3D-рендеринга. (Я также понимаю, что WFP имеет упрощенный 3D API, но я не думаю, что это сработало бы в моем случае, потому что у меня слишком много треугольников для рендеринга.) В моем случае я хотел бы использовать OpenGL, потому что есть хорошие шансы все приложение будет перенесено на компьютер, отличный от Windows, и я не хочу переписывать 3D-код.

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

В качестве более безопасного подхода я подумал, что мог бы использовать FBO с OpenGL для рендеринга кадров вне экрана, а затем взять растровые изображения и передать их в реальном времени в WPF как обычные 2D-изображения.

Мой вопрос о скорости. Ожидаете ли вы, что в этой схеме будут узкие места? Я предполагаю, что рендеринг FBO будет примерно таким же быстрым, как прямой рендеринг окон на стороне OpenGL? И я ожидаю, что извлечение растровых изображений из визуализированных изображений OpenGL (FBO) должно быть быстрым? Я менее уверен в том, чтобы передать эти изображения в WFP и увидеть, как они обновляются со скоростью 20 FPS.

У вас есть конкретный опыт, который может помочь мне решить, является ли это разумным путем?

1 ответ

Решение

Я хотел бы использовать OpenGL, потому что есть большая вероятность, что все приложение будет перенесено на машину, отличную от Windows

Но тогда это означает, что вам также нужно переписать все приложение WPF, так как этот фреймворк не является кроссплатформенным. Так что в этом случае часть OpenGL будет представлять собой лишь небольшую проблему. Я думаю, вам следует пересмотреть всю технологию пользовательского интерфейса. Например, я бы использовал Qt SDK, поскольку он действительно кроссплатформенный, и вы можете подключить его как к DirectX, так и к OpenGL по желанию. Но если вы планируете использовать WPF в Windows и использовать OpenGL, просто используйте оболочку C# OpenGL. Да, вы получите некоторое снижение производительности, потому что это оболочка. Так же, как и для Java (JOGL, LWJGL). Но игры, подобные MineCraft, изначально были написаны и прекрасно работали с этими API. Другой, более сложный подход заключается в взаимодействии WPF COM и вызове некоторого приложения C++, которое оборачивает ваш рендерер OpenGL напрямую из WPF, возможно, даже использует небезопасный режим, чтобы получить как можно более низкий уровень. Никогда не пробовал сам, но он может повысить производительность..Но это много работы на самом деле. Наконец, я бы предложил вам использовать DirectX для Windows, так как WPF естественным образом лучше всего интегрируется с ним. Если вы хорошо спроектируете свое приложение, то не составит труда подключить его к бэкэнду OpenGL позже.

Другие вопросы по тегам