Моя проблема в том, что я хочу сделать своего рода снимок трехмерной сцены, манипулировать этим снимком и нарисовать его в другом окне просмотра сцены,
Я просто прочитал изображение, используя метод glReadPixel.
Теперь я хочу нарисовать это изображение в указанном окне просмотра, но с использованием современного OpenGL.
Я прочитал о FrameBufferObject (fbo) и PixelBufferObject (pbo) и о решении записать обратно содержимое FrameBufferObject в gl2DTexture и передать его в FragementShader в виде простой текстуры.
Является ли этот способ правильным или кто-нибудь может предоставить простой пример того, как визуализировать изображение обратно на сцену, используя современный OpenGL, а не устаревший glDrawPixel
метод?
Общий процесс, который вы хотите сделать, будет выглядеть примерно так
Создайте FBO с привязкой цвета и глубины. Свяжите это.
Визуализируйте свою сцену
Скопируйте содержимое из его цветного вложения в память клиента, чтобы выполнить необходимые операции с ним. *
Скопируйте изображение обратно в текстуру OpenGL (может сохранить ту же самую).
Привязать кадровый буфер по умолчанию (0)
Рендеринг полноэкранного четырехугольника с использованием вашего изображения в качестве карты текстуры. (Возможно использование другого шейдера или переключение функциональности шейдера).
Возможные вопросы, которые могут у вас возникнуть:
Нужно ли рендерить полноэкранный квад? Ага. Вы не можете обойти вершинный шейдер. Так что где-нибудь просто сделайте четыре вершины с текстурными координатами в VBO, yada yada.
Мой вершинный шейдер имеет дело с проектированием, как мне справиться с этим квадом? Вы можете создать подпрограмму, которая переключает способ работы с вершинами в вашем вершинном шейдере. Один может быть для обычного трехмерного рендеринга (то есть преобразования из модельного пространства в мир / вид / пространство экрана), а другой может быть просто проходом, который отправляет ваши вершины без изменений. Вы просто хотите, чтобы ваши вершины были в четырех углах квадрата от (-1, -1) до (1,1). Отправьте их в свой фрагментный шейдер, и он будет делать то, что вы хотите. При желании вы можете просто установить все свои матрицы на идентичность, если вы не хотите использовать подпрограммы.
* Если вы можете найти способ сделать ваши текстурные операции в шейдере, я очень рекомендую это. GPU довольно буквально построен за это.
Других решений пока нет …