Как нарисовать трехмерное изображение (перспективный проект) обратно в другое окно просмотра с ортогональным проектором. одновременно использовать несколько Viewports и OpenGL

Моя проблема в том, что я хочу сделать своего рода снимок трехмерной сцены, манипулировать этим снимком и нарисовать его в другом окне просмотра сцены,

Я просто прочитал изображение, используя метод glReadPixel.
Теперь я хочу нарисовать это изображение в указанном окне просмотра, но с использованием современного OpenGL.

Я прочитал о FrameBufferObject (fbo) и PixelBufferObject (pbo) и о решении записать обратно содержимое FrameBufferObject в gl2DTexture и передать его в FragementShader в виде простой текстуры.

Является ли этот способ правильным или кто-нибудь может предоставить простой пример того, как визуализировать изображение обратно на сцену, используя современный OpenGL, а не устаревший glDrawPixel метод?

0

Решение

Общий процесс, который вы хотите сделать, будет выглядеть примерно так

  1. Создайте FBO с привязкой цвета и глубины. Свяжите это.

  2. Визуализируйте свою сцену

  3. Скопируйте содержимое из его цветного вложения в память клиента, чтобы выполнить необходимые операции с ним. *

  4. Скопируйте изображение обратно в текстуру OpenGL (может сохранить ту же самую).

  5. Привязать кадровый буфер по умолчанию (0)

  6. Рендеринг полноэкранного четырехугольника с использованием вашего изображения в качестве карты текстуры. (Возможно использование другого шейдера или переключение функциональности шейдера).

Возможные вопросы, которые могут у вас возникнуть:

  • Нужно ли рендерить полноэкранный квад? Ага. Вы не можете обойти вершинный шейдер. Так что где-нибудь просто сделайте четыре вершины с текстурными координатами в VBO, yada yada.

  • Мой вершинный шейдер имеет дело с проектированием, как мне справиться с этим квадом? Вы можете создать подпрограмму, которая переключает способ работы с вершинами в вашем вершинном шейдере. Один может быть для обычного трехмерного рендеринга (то есть преобразования из модельного пространства в мир / вид / пространство экрана), а другой может быть просто проходом, который отправляет ваши вершины без изменений. Вы просто хотите, чтобы ваши вершины были в четырех углах квадрата от (-1, -1) до (1,1). Отправьте их в свой фрагментный шейдер, и он будет делать то, что вы хотите. При желании вы можете просто установить все свои матрицы на идентичность, если вы не хотите использовать подпрограммы.

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]