4

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

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

4

2 回答 2

5

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

于 2009-12-17T15:48:13.740 回答
0

使问题标题超出图像的效果以产生“真实”的鱼眼视图,即。可用视野 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. 使用“ray”表在屏幕上迭代发射(梯形)GL_QUAD_STRIP-s 的纹理。

方法 1 更简单,并提供更好的结果。

陷阱:

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

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

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

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

于 2021-08-27T21:03:30.407 回答