c++ - 如何使用正交投影将 3d 渲染图像(透视投影)绘制回另一个视口(viewport)。同时使用多个视口(viewport)和 OpenGL

标签 c++ opengl viewport opengl-3

<分区>

我的问题是我想拍摄一种 3d 场景的快照,操作该快照并将其绘制回场景的另一个视口(viewport),

我只是使用 glReadPixel 方法读取图像。 现在我想将该图像拉回指定的视口(viewport),但使用现代 OpenGL。

我阅读了 FrameBufferObject (fbo) 和 PixelBufferObject (pbo) 以及将 FrameBufferObject 内容写回 gl2DTexture 并将其作为简单纹理传递给 FragementShader 的解决方案。

这种方式是否正确,或者任何人都可以提供一个简单的示例来说明如何使用现代 OpenGL 而不是已弃用的 glDrawPixel 方法将图像渲染回场景?

最佳答案

你想要做的整个过程看起来像这样

  1. 创建一个带有颜色和深度附件的 FBO。绑定(bind)它。

  2. 渲染你的场景

  3. 将颜色附件中的内容复制到客户端内存中,以对其进行您想要的操作。*

  4. 将图像复制回 OpenGL 纹理(最好保留相同的纹理)。

  5. 绑定(bind)默认帧缓冲区(0)

  6. 使用您的图像作为纹理贴图渲染全屏四边形。 (可能使用不同的着色器或切换着色器功能)。

您可能有的问题:

  • 我必须渲染全屏四边形吗? 是的。您无法绕过顶点着色器。因此,只需在 VBO 中创建四个具有纹理坐标的顶点,yada yada。

  • 我的顶点着色器处理投影的事情,我该如何处理那个四边形?您可以创建一个子例程来切换您在顶点着色器中处理顶点的方式。一个可以用于常规 3D 渲染(即从模型空间转换到世界/ View /屏幕空间),一个可以只是一个传递,沿着您的顶点发送未修改的。您只需要在 (-1,-1) 到 (1,1) 正方形的四个角上设置顶点。将它们发送到您的片段着色器,它会执行您想要的操作。如果您不想使用子例程,您可以选择将所有矩阵设置为恒等矩阵。

*如果您能找到一种在着色器中执行纹理操作的方法,我强烈推荐它。 GPU 确实是为此构建的。

关于c++ - 如何使用正交投影将 3d 渲染图像(透视投影)绘制回另一个视口(viewport)。同时使用多个视口(viewport)和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20602982/

相关文章:

c++ - 为什么 CoCreateInstance 在某些 Windows 上返回 REGDB_E_CLASSNOTREG?

C++ 程序在命令行上工作但在 Xcode 上失败

C++ 虚拟继承

c++ - Point vector 中的 push_back() 不起作用

opengl - 使用基于递归的动画时在 drawPicture "Gloss/OpenGL Stack Overflow "之后出现错误 .""

html - 如何获取设备的宽度(不是视口(viewport))?

opengl - glVertexAttribDivisor和索引输入

c++ - 如何解决未处理的异常? (OpenGL, GLFW3)

JavaFX ScrollPane 以编程方式移动视口(viewport) - 居中内容

javascript - 如何使用sttrek/scrollMonitor的方法 'one'?