如何通过openGL创建鱼眼镜头效果? [复制]

Posted

技术标签:

【中文标题】如何通过openGL创建鱼眼镜头效果? [复制]【英文标题】:How to create fisheye lens effect by openGL? [duplicate] 【发布时间】:2009-12-17 06:49:10 【问题描述】:

我正在尝试使用 openGL 在图像上创建 lomo 鱼眼效果。

我应该使用立方体映射和鱼眼投影吗?有没有开源可以参考?

【问题讨论】:

Fisheye Quake,对 GLQuake 的修改,你应该会感兴趣。自带源码。 谢谢!我会看看那个。发布此问题后,我对openCV进行了一些研究,是否可以通过openCV来模拟鱼眼?我看到有一个相机校准功能,它有助于校正像鱼眼一样的径向失真。 我认为 OpenCV 将比直接学习和做更多的工作。 【参考方案1】:

您可以绘制带有纹理的图像的单个四边形,并使用片段着色器根据需要扭曲每个像素的纹理坐标。您必须自己完成所有数学运算,但看起来上一篇文章可能是一个很好的起点。

【讨论】:

【参考方案2】:

使问题标题超出对图像的影响以产生“真实”的鱼眼视图,即。可用视野 180+ 度...

有两种稍微不同的方法可以使现有管道适应鱼眼视图(使用“简单”OpenGL)。两者都需要最多 6 次场景渲染 - 对于将投影到平面屏幕的“盒子”的每一侧。每个侧面/表面都必须是方形的 - 或者应该是方形的,这取决于方法 - 并且可能小于原始的完整视口。

所需的边数取决于请求的鱼眼视野宽度。在典型的 FPS 中,对于 130 的 FOV - 三边就足够了。对于高达 220 的 FOV - 五面。

方法 1 - 立方体贴图纹理 (GL_ARB_texture_cube_map)

    初始化一次,对于特定的 FOV,预先计算 2d 屏幕坐标到立方体贴图纹理 3d 坐标的转换表,整个屏幕的 16x16 网格应该足够了 设置视口并相应地定位相机以渲染盒子的侧面,进行通常的渲染 将边绑定到 GL_TEXTURE_CUBE_MAP_ARB 纹理 使用转换表和立方体贴图遍历屏幕发射(矩形)GL_QUAD_STRIP-s。

方法 2 - 2d 或矩形纹理 (GL_NV_texture_rectangle)

    初始化一次,对于特定的 FOV,预先计算纹理的“射线”表 + 2d 纹理坐标到 2d 屏幕坐标 与方法 1 一样,设置视口并相应地定位相机以渲染盒子的侧面,进行通常的渲染 将边绑定到 GL_TEXTURE_RECTANGLE_NV 或 GL_TEXTURE_2D 纹理 使用“光线”表迭代在屏幕上发射(梯形)GL_QUAD_STRIP-s 的纹理。

方法 1 更简单,效果更好。

陷阱:

将立方体贴图纹理环绕设置为 GL_CLAMP_TO_EDGE 在典型的 FPS 中,玩家视图不仅是俯仰和偏航,还包括滚动 - 通过适当的旋转计算每一侧的摄像机方向 如果渲染循环与进度/物理/人工智能相结合,这种重复的场景重新渲染可能会混淆现有的内部结构。

这当然取决于特定引擎的具体情况。我不确定这适用于 OpenGL 3.3+ 核心配置文件的效果如何,但想法应该是相同的。

通过在顶点着色器中进行鱼眼变换,可以一次将世界绘制到鱼眼。但!它需要充分(预先)细分的原始几何图形。或者,可以使用几何着色器和/或镶嵌着色器来组织 GPU 上的镶嵌/变换反馈。也许后者应该从头开始构建到渲染中。

有关使用 Quake 1 引擎的隔离良好的示例,请参阅Fisheye and Panorama OpenGL FPS 和此diff。不幸的是,顶点着色器示例丢失了。

【讨论】:

以上是关于如何通过openGL创建鱼眼镜头效果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中实现鱼眼镜头效果(桶形变换)?

鱼眼图以“镜头球面ROI”方式还原

IOS – OpenGL ES 图像鱼眼扩散效果 GPUImageBulgeDistortionFilter

车载导航为啥不支持鱼眼摄像头

从普通图像创建鱼眼效果的算法

500万鱼眼摄像头多大范围