请教关于opengl中FBO离屏渲染的使用

时间:2021-09-09 18:34:48
我的需求是这样:希望在Opengl场景渲染完成得到一帧图像后,能够直接对此图像的像素点进行操作,然后再显示到屏幕上。
查了一下资料,最接近的就是用FBO进行离屏渲染了。但是没有找到具体该怎么做。

目前我只知道创建Framebuffer,再创建Renderbuffer并关联至Framebuffer上,然后进行渲染,这样渲染的图像就会被保存在Renderbuffer中。但是如何对Renderbuffer中的图像数据进行像素点的操作(也就是直接的内存操作),以及如何将Renderbuffer中的数据在屏幕上再次显示出来,目前完全没有头绪。找到的教程和资料中也没有写,只看到过有一篇文章使用Windows的CDC来取得图像数据做到了近似的效果,我希望能在多平台下运行所以不能使用这种方法。

有高手对这方面很熟悉的话麻烦指点一下,谢谢!

9 个解决方案

#1


主要思路是对的

1,渲染的图像渲染到Framebuffer后,可以得到一张纹理,这个你应该会的

2,再次渲染这张纹理(不是渲染到framebuffer)

3,进行像素点的操作你可以在内存里操作,但耗时,建议用glhl,在ps里操作就行了

#2


建议不要用glsh

建议用cg, 可以跟Direct3D的hlsl互通

#3


对Renderbuffer的操作不应该由CPU来做,而应该用GPU的Shader来完成

#4


google一下很多资料的

http://www.songho.ca/opengl/gl_fbo.html

#5


回复1楼:能否再详细讲一下?得到纹理没问题,但我想做的是在对得到的图像进行操作后再把这图像直接显示在屏幕上,而不是作为纹理贴在物体上。这方面我是新手,在网上也没找到实现类似功能的代码,所以不知道该如何实现。

回复2楼:D3D是只支持windows系统的吧?我需要支持多系统(至少有linux),所以这个应该不能用吧。同样的,“对Renderbuffer的操作不应该由CPU来做,而应该用GPU的Shader来完成”,还是不知道如何实现。我想要做的操作是类似“渲染后的图像中所有纯黑色全部换成纯绿色然后再显示”这样的事情。

回复4楼:这个资料我看过,里面的sample只是讲怎么做出纹理吧,没办法实现我所要达到的效果。

#6


如果用CG则可以兼容D3D,CG也可在linux上跑。

创建一个平面贴在屏幕上,纹理贴在平面上。

#7


更正一下,是glsl,笔误笔误

直接显示在屏幕上,而不是作为纹理贴在物体上


贴在物体上你会,再次绘制到屏幕上,你却不会?有点奇怪

#8


引用 7 楼 higter 的回复:
更正一下,是glsl,笔误笔误

直接显示在屏幕上,而不是作为纹理贴在物体上


贴在物体上你会,再次绘制到屏幕上,你却不会?有点奇怪

贴在物体上就是做个纹理贴图,这个没问题。
绘制到屏幕上等于是将修改过的内存里的图像作为显示内容直接显示在屏幕上,在opengl下我的确不知道该怎么做……我倒也想过lss的这种做法,不过总感觉应该还有更正统一点的做法
我玩opengl也是新手,还请高手指点

#9


opengl下此方法也是正统,其他方法都很难快过这种

#1


主要思路是对的

1,渲染的图像渲染到Framebuffer后,可以得到一张纹理,这个你应该会的

2,再次渲染这张纹理(不是渲染到framebuffer)

3,进行像素点的操作你可以在内存里操作,但耗时,建议用glhl,在ps里操作就行了

#2


建议不要用glsh

建议用cg, 可以跟Direct3D的hlsl互通

#3


对Renderbuffer的操作不应该由CPU来做,而应该用GPU的Shader来完成

#4


google一下很多资料的

http://www.songho.ca/opengl/gl_fbo.html

#5


回复1楼:能否再详细讲一下?得到纹理没问题,但我想做的是在对得到的图像进行操作后再把这图像直接显示在屏幕上,而不是作为纹理贴在物体上。这方面我是新手,在网上也没找到实现类似功能的代码,所以不知道该如何实现。

回复2楼:D3D是只支持windows系统的吧?我需要支持多系统(至少有linux),所以这个应该不能用吧。同样的,“对Renderbuffer的操作不应该由CPU来做,而应该用GPU的Shader来完成”,还是不知道如何实现。我想要做的操作是类似“渲染后的图像中所有纯黑色全部换成纯绿色然后再显示”这样的事情。

回复4楼:这个资料我看过,里面的sample只是讲怎么做出纹理吧,没办法实现我所要达到的效果。

#6


如果用CG则可以兼容D3D,CG也可在linux上跑。

创建一个平面贴在屏幕上,纹理贴在平面上。

#7


更正一下,是glsl,笔误笔误

直接显示在屏幕上,而不是作为纹理贴在物体上


贴在物体上你会,再次绘制到屏幕上,你却不会?有点奇怪

#8


引用 7 楼 higter 的回复:
更正一下,是glsl,笔误笔误

直接显示在屏幕上,而不是作为纹理贴在物体上


贴在物体上你会,再次绘制到屏幕上,你却不会?有点奇怪

贴在物体上就是做个纹理贴图,这个没问题。
绘制到屏幕上等于是将修改过的内存里的图像作为显示内容直接显示在屏幕上,在opengl下我的确不知道该怎么做……我倒也想过lss的这种做法,不过总感觉应该还有更正统一点的做法
我玩opengl也是新手,还请高手指点

#9


opengl下此方法也是正统,其他方法都很难快过这种