2011-10-06 171 views
1

我想创建一个OpenGL应用程序与水波和折射。我需要投射来自太阳和相机的光线,并找出它们相交的地方,或者我需要从海底开始,找出我必须去哪个方向(如果有的话),以便击中太阳或相机。我有点卡住了,任何人都可以给我一个OpenGL光线投射或高级几何中的速成课程的入门吗?我不想让海底处于恒定的深度,我不希望水波是简单的正弦波。OpenGL水折射

+0

我的一个想法是首先投射一个初始射线并查看它的着陆点。然后使用相对于第一条光线的小步骤,使用衍生物来查看下一条光线将要着陆的位置。但我是OpenGL的新手,所以我不知道我可以访问多少信息。我甚至会如何开始投射射线,我的意思是如果没有片段我只想投射一些射线,我该如何运行片段着色器? –

回答

3

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

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

有一个WebGL的演示,呈现惊人的好看,互动水:http://madebyevan.com/webgl-water/这里是它在YouTube上http://www.youtube.com/watch?v=R0O_9bp3EKQ

视频该演示使用真实光线追踪(水面,球体和游泳池的光线追踪) ,基于投影水面高度图的二阶导数,焦散是“假焦散”效应。

+0

“全”光线追踪几乎总是太昂贵,所以我们必须经常欺骗某个地方。这个演示很好,但是当水的运动很大时你可以看到它的极限。可惜,这是非常好的。 – spraff

+1

+1“OpenGL本身只是一个复杂的三角形来屏幕绘制API”。它应该以72pt大胆写入任何人开始 – Kromster

1

没有什么特别的OpenGL相关的。

您是否在谈论caustics?这里是another good Gamasutra article

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

什么你在这里后是大量的小办法:-)

+0

哦,我想在OpenGL中做这件事,因为我希望代码是可移植的。我可以用软件轻松完成,但这可能会减慢速度。 –

+0

是的,焦散是我正在寻找的一部分。如果我之前阅读过这篇文章,听起来似乎是熟悉的钟声,但我对“审美”算法不感兴趣,我想要真正的交易。 –

+0

哎呀,是的,我已经阅读过那篇文章,我在滚动时识别屏幕截图。我不喜欢它,似乎是一个愚蠢的方法,结果也不是一个好例子。但是,尽管感谢分享,但迟早我必须了解如何做到这一点。 –

0

欺骗Techincally,你认为是光波/光子反弹的表面,并通过媒介传播的结果。对于“实打实”你必须从Sun与各射线直接追踪光的路径如下:

  • 击中水面
  • 折射+反映,反映进入相机(*) ,折射部分更进一步
  • 命中海底
  • 反映
  • 碰到水底下
  • 反映+折射,折射部分失控的水,命中相机(*),再次反射进入海底,反射ects等

(*)其实,大多数射线会错过相机,但这将是过于昂贵,所以这是一个骗子。

对至少三种波长 - “红色”,“绿色”和“蓝色”进行此操作。他们每个人都会有不同的折射和反映。将三者结合起来可以得到整个画面。

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

这是一个直接,简单,计算量非常大的方法,可以近似于焦散以外的物理。第一