将着色器应用于帧缓冲对象以获得鱼眼效果

时间:2010-11-24 15:51:14

标签: opengl graphics glsl

假设我有一个应用程序(应用程序的详细信息应该是解决问题的无关紧要)。而不是渲染到屏幕,我能够以某种方式强制应用程序渲染到帧缓冲对象而不是渲染到屏幕(搞乱glew或拦截dll中的调用)。

一旦应用程序将其内容呈现给FBO,是否可以将着色器应用于FB的内容?我的知识在这里是有限的,所以从我在这个阶段理解的所有关于顶点的信息不再可用并且已经应用​​了所有必要的测试,因此缓冲区中剩下的只是像素数据。这是对的吗?

如果可以将着色器应用于FBO,是否可以获得鱼眼效果? (例如:http://idea.hosting.lv/a/gfx/quakeshots.html

上面的linke中使用的技术是创建6个不同的视口,并将每个视口渲染到立方体贴图面,然后将纹理应用到网格中。

由于

2 个答案:

答案 0 :(得分:4)

framebuffer对象封装了其他几个缓冲区,特别是那些被片段位置隐式索引的缓冲区。因此,单个帧缓冲对象可以将颜色缓冲区,深度缓冲区,模板缓冲区和其他一组缓冲区捆绑在一起。各个缓冲区称为渲染缓冲区。

你是对的 - 那里没有几何形状。为了回读场景,你只得到最终的片段值,如果你正在劫持现有的应用程序,那么可能是帧的2d像素图像以及其他一些你不关心的事情。

如果您的GPU具有渲染到纹理支持(最初是OpenGL 1.3的扩展,但现在很难找到没有它的GPU,即使在移动电话中),那么您可以将纹理链接为渲染缓冲区帧缓冲。因此渲染代码与正常情况完全一样,但最终将结果写入纹理,然后可以将其用作绘图源。

片段着色器可以以编程方式决定要采样的纹理贴图的哪个位置以创建其输出。因此,你可以编写一个应用鱼眼镜头的片段着色器,但显然你只能局限于原始纹理中呈现的视野。如果您只有可用立方体的一面而不是六面,那么这可能就是您在Quake示例中得到的内容。

总结:对于您的所有问题,答案都是肯定的。简要介绍了framebuffer对象here

答案 1 :(得分:2)

在这里查看一些相关信息:

http://www.opengl.org/wiki/Framebuffer_Object

简短的解释是,FBO是软件帧缓冲区的3D等价物。您可以直接访问单个像素,而无需修改纹理并上传它。你可以让着色器指向一个FBO。上面的链接概述了该程序。