如何通过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创建鱼眼镜头效果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章