1

我正在尝试使用水波和折射创建一个 OpenGL 应用程序。我需要先投射来自太阳的光线,然后是相机,然后找出它们相交的位置,或者我需要从海底开始,弄清楚我必须朝哪个方向(如果有的话)去撞击太阳或相机。我有点卡住了,任何人都可以给我一个关于 OpenGL 光线投射或高级几何速成课程的信息吗?我不希望海底处于恒定深度,也不希望水波是简单的正弦波。

4

3 回答 3

3

第一件事:你想要达到的效果可以使用OpenGL来实现,但这不是OpenGL的特性。OpenGL 本身只是一个复杂的三角形到屏幕绘图 API。您获得了一些输入数据并编写了一个程序,该程序使用 OpenGL API 基于输入数据执行相对简单的光栅化绘图操作。着色器给它一些空间;您可以在片段着色器中实现光线追踪器。

在您的情况下,这意味着您必须实现某种算法来生成您想要的图片。因为水必须是某种光线追踪器或假折射方法才能获得看水的效果。焦散需要一个全功能的光子映射器,或者你很擅长基于水面的二阶导数的假效果。

有一个 WebGL 演示,呈现非常漂亮的交互式水:http ://madebyevan.com/webgl-water/这是 YouTube 上的视频http://www.youtube.com/watch?v=R0O_9bp3EKQ

此演示使用真正的光线追踪(对水面、球体和水池进行光线追踪),焦散是“假焦散”效果,基于投影水面高度图的二阶导数。

于 2011-10-06T13:39:14.270 回答
1

没有什么特别针对 OpenGL 的。

你说的是焦散吗?这是另一篇很好的 Gamasutra 文章

反射通常是通过在镜子平面中反射相机并渲染到纹理来实现的,您可以应用失真,然后使用它来纹理水面。这仅适用于小波。

您在这里所追求的是许多作弊的小方法:-)

于 2011-10-06T13:02:23.077 回答
0

从技术上讲,您所感知的只是光波/光子从表面反弹并通过介质传播的结果。对于“真正的交易”,您必须直接追踪来自太阳的光线,每条光线都沿着路径:

  • 撞击水面
  • 折射+反射,反射进入相机(*),折射部分走得更远
  • 撞到海底
  • 反映
  • 从下面打水
  • 反射+折射,折射部分从水中出来并撞击相机(*),再次反射到海底,反射等。

(*) 实际上,大部分光线都会错过相机,但这会过于昂贵,所以这是一个作弊。

至少对三个波长执行此操作 - “红色”、“绿色”和“蓝色”。它们中的每一个都会以不同的方式折射和反射。通过将这三者结合起来,您将获得全貌。

然后,您只需使用进入相机的光线创建一个纹理并在 OpenGL 中覆盖它。

这是一种直截了当、简单且计算成本非常高的方法,它可以近似于焦散之外的物理。

于 2011-10-06T13:36:10.973 回答