【问题标题】:How to create fisheye lens effect by openGL? [duplicate]如何通过openGL创建鱼眼镜头效果? [复制]
【发布时间】:2010-12-27 13:19:45
【问题描述】:

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

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

【问题讨论】:

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

标签: opengl fisheye


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    方法 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 中,玩家视图不仅是俯仰和偏航,还包括滚动 - 通过适当的旋转计算每一侧的摄像机方向
    • 如果渲染循环与进度/物理/人工智能相结合,这种重复的场景重新渲染可能会混淆现有的内部结构。

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多