我想创建一个OpenGL应用程序与水波和折射。我需要投射来自太阳和相机的光线,并找出它们相交的地方,或者我需要从海底开始,找出我必须去哪个方向(如果有的话),以便击中太阳或相机。我有点卡住了,任何人都可以给我一个OpenGL光线投射或高级几何中的速成课程的入门吗?我不想让海底处于恒定的深度,我不希望水波是简单的正弦波。OpenGL水折射
回答
一件事:你想达到的效果可以用的OpenGL实现,但它不是一个功能的OpenGL 。 OpenGL本身只是一个复杂的三角形来屏幕绘制API。您获得了一些输入数据并编写了一个程序,该程序使用OpenGL API根据输入数据执行相对简单的栅格化绘图操作。着色器给它一些空间;您可以在片段着色器中实施光线跟踪器。
在你的情况下,这意味着,你必须实现一些算法来生成你想要的图片。对于水是必须的某种光线追踪或假折射方法才能获得看水的效果。焦散需要一个完整的特征光子映射器,或者你基于水面的二阶导数假效果很好。
有一个WebGL的演示,呈现惊人的好看,互动水:http://madebyevan.com/webgl-water/这里是它在YouTube上http://www.youtube.com/watch?v=R0O_9bp3EKQ
视频该演示使用真实光线追踪(水面,球体和游泳池的光线追踪) ,基于投影水面高度图的二阶导数,焦散是“假焦散”效应。
没有什么特别的OpenGL相关的。
您是否在谈论caustics?这里是another good Gamasutra article。
反射通常通过将镜头反射到镜面并渲染为纹理来实现,您可以应用畸变,然后使用它来纹理化水面。这只适用于小波浪。
什么你在这里后是大量的小办法:-)
哦,我想在OpenGL中做这件事,因为我希望代码是可移植的。我可以用软件轻松完成,但这可能会减慢速度。 –
是的,焦散是我正在寻找的一部分。如果我之前阅读过这篇文章,听起来似乎是熟悉的钟声,但我对“审美”算法不感兴趣,我想要真正的交易。 –
哎呀,是的,我已经阅读过那篇文章,我在滚动时识别屏幕截图。我不喜欢它,似乎是一个愚蠢的方法,结果也不是一个好例子。但是,尽管感谢分享,但迟早我必须了解如何做到这一点。 –
欺骗Techincally,你认为是光波/光子反弹的表面,并通过媒介传播的结果。对于“实打实”你必须从Sun与各射线直接追踪光的路径如下:
- 击中水面
- 折射+反映,反映进入相机(*) ,折射部分更进一步
- 命中海底
- 反映
- 碰到水底下
- 反映+折射,折射部分失控的水,命中相机(*),再次反射进入海底,反射ects等
(*)其实,大多数射线会错过相机,但这将是过于昂贵,所以这是一个骗子。
对至少三种波长 - “红色”,“绿色”和“蓝色”进行此操作。他们每个人都会有不同的折射和反映。将三者结合起来可以得到整个画面。
然后,您只需使用进入相机的光线创建一个纹理,并将其覆盖在OpenGL中。
这是一个直接,简单,计算量非常大的方法,可以近似于焦散以外的物理。第一
- 1. OpenGL半透明固体没有折射?
- 2. GLEW和OpenGL折旧
- 3. 如何在OpenGL中实现折射表面?
- 4. Opengl折射,纹理重复在椭球物体上
- 5. Raytracer折射Bug
- 6. OpenGL射灯
- 7. 折射库组件
- 8. OpenGL:哪些OpenGL实现不流水?
- 9. OpenGL纹理映射
- 10. OpenGL纹理映射
- 11. 创建反射Opengl
- 12. OpenGL的纹理水平
- 13. 射线追踪 - 折射错误
- 14. 色差反射/折射 - 眼睛校正
- 15. 使用Three.CubeCamera的折射
- 16. OpenGL纹理映射问题
- 17. android OpenGL ES坐标映射
- 18. OpenGL纹理映射错误
- 19. OpenGL C#球发射器
- 20. 的OpenGL纹理映射
- 21. openGL的纹理映射
- 22. 对于射线追踪折射/反射,不应该透射率+反射率= 1?
- 23. Java的括号折射率匹配
- 24. 折射率匹配多个文件
- 25. 在CPP阵列负折射率
- 26. EF挫折映射视图对象
- 27. 未归一化的折射向量
- 28. html5 css3玻璃效果与折射
- 29. OpenGL坐标映射到设备坐标
- 30. 在OpenGL中将纹理映射到VBO
我的一个想法是首先投射一个初始射线并查看它的着陆点。然后使用相对于第一条光线的小步骤,使用衍生物来查看下一条光线将要着陆的位置。但我是OpenGL的新手,所以我不知道我可以访问多少信息。我甚至会如何开始投射射线,我的意思是如果没有片段我只想投射一些射线,我该如何运行片段着色器? –