如何使用OpenGL创建鱼眼镜头效果?

4

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

我应该使用立方体贴图和鱼眼投影吗?是否有任何开源代码可以参考?


2
Fisheye Quake是GLQuake的一个修改版本,可能会对您感兴趣。附带源代码。 - daxim
谢谢!我会看一下。 在我发了这个问题之后,我对openCV进行了一些研究,是否可能通过openCV来模拟鱼眼效果呢?我看到有一个相机校准功能可用,它可以帮助纠正径向畸变,比如鱼眼效果。 - 0pcl
我认为学习并直接操作比使用OpenCV更费力。 - Daniel Yankowsky
2个回答

5

您可以绘制一个带有图像纹理的单个四边形,并使用片段着色器按每个像素自定义纹理坐标。您需要自己计算所有数学问题,但是前面的帖子可能是一个很好的起点。


1
将问题标题从对图像的影响扩展到产生“真正”的鱼眼视图,即可用视野180+度...
有两种稍微不同的方法可以使用“简单”OpenGL将现有管道适应为鱼眼视图。这两种方法都需要场景渲染多达6次-每个将投影到平面屏幕上的“盒子”的侧面。每个侧面/表面必须是正方形-或者应该是,这取决于方法-并且可能比原始全视口小。
所需侧面的数量取决于所请求的鱼眼视野有多宽。在典型FPS中,对于FOV 130-三个侧面就足够了。对于FOV高达220-五个侧面。
方法1-立方体贴图(GL_ARB_texture_cube_map)
  1. 为特定的FOV仅初始化一次,预先计算一个2D屏幕坐标到立方体贴图3D坐标的转换表,整个屏幕使用16x16网格应该足够。
  2. 设置视口并相应地定位摄像机以渲染盒子侧面,进行常规渲染。
  3. 将侧面绑定到GL_TEXTURE_CUBE_MAP_ARB纹理上。
  4. 使用转换表和立方体贴图迭代屏幕发射(矩形)GL_QUAD_STRIP-s。

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

  1. 为特定的FOV仅初始化一次,预先计算一个“光线”表,包括纹理和2D纹理坐标到2D屏幕坐标。
  2. 与方法1相同,设置视口并相应地定位摄像机以渲染盒子侧面,进行常规渲染。
  3. 将侧面绑定到GL_TEXTURE_RECTANGLE_NV或GL_TEXTURE_2D纹理上。
  4. 使用“光线”表在屏幕上发射(梯形)GL_QUAD_STRIP-s。

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

需要注意的事项:

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

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

可以通过在顶点着色器中进行鱼眼变换来一次性绘制世界到鱼眼中。但是!这需要足够(预)细分的原始几何体。或者,可以使用几何着色器和/或曲面细分着色器在GPU上组织细分/变换反馈。后者应该从底层构建到渲染器中。

关于使用Quake 1引擎的良好隔离示例,请参见 Fisheye and Panorama OpenGL FPS以及特别是这个 diff。不幸的是,顶点着色器示例已经丢失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接