OpenGL水折射

时间:2011-10-06 12:53:11

标签: opengl raycasting

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

3 个答案:

答案 0 :(得分:3)

首先要做的事情:您尝试实现的效果可以使用 OpenGL实现,但它不是 OpenGL的功能。 OpenGL本身就是一个复杂的三角形屏幕绘图API。您获得了一些输入数据并编写了一个程序,该程序使用OpenGL API根据输入数据执行相对简单的栅格化绘制操作。着色器给它一些空间;您可以在片段着色器中实现光线跟踪。

在你的情况下,这意味着你必须实现一些生成你想要的图片的算法。对于水必须是某种光线追踪器或假冒折射方法才能获得俯视水的效果。焦散需要一个完整的特征光子映射器,或者你对基于水面的二阶导数的假效果很好。

有一个WebGL演示,呈现出令人惊叹的漂亮,互动的水:http://madebyevan.com/webgl-water/这是YouTube上的视频http://www.youtube.com/watch?v=R0O_9bp3EKQ

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

答案 1 :(得分:1)

对此没有特定的OpenGL特定内容。

你在谈论caustics吗?这是another good Gamasutra article

通常通过将镜头反射到镜子平面并渲染到纹理来实现反射,您可以应用扭曲然后使用它来纹理水面。这只适用于小波浪。

你在这里找到的是很多可以欺骗的小方法: - )

答案 2 :(得分:0)

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

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

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

对至少三个波长执行此操作 - “红色”,“绿色”和“蓝色”。他们每个人都会折射和反射不同。你将通过结合三者来全面了解。

然后,您只需创建一个纹理,其中包含进入相机的光线并将其覆盖在OpenGL中。

这是一种直接,简单且计算量很大的方式,它可以提供超出焦散的物理近似值。