UFO中文网

 找回密码
 注册会员
查看: 1903|回复: 15
收起左侧

黑洞是什么颜色的,如果忧郁是蓝色的

[复制链接]
78_avatar_middle
online_member 发表于 2018-6-13 20:21:40 | 显示全部楼层 |阅读模式
黑的,废话。全文完。
就这么完了吗?当然不是。虽然如何渲染黑洞原先在MSRA的时候是个段子,但我现在就来一步步把它模拟出来,看看如何在图形程序中嵌入一个效果“真实”并且能达到实时性能的黑洞。本文大量参考了Shadertoy上Harha的代码 https://www.shadertoy.com/view/llSGRG。模拟的目标效果是《星际穿越》里的效果http://www.wired.com/2014/10/astrophysics-interstellar-black-hole/。

场景

首先看看没有黑洞的时候,我们的场景设置。今天我们要拿来折腾的就是一个environment map,和一个金属骨头龙。
黑洞是什么颜色的,如果忧郁是蓝色的541 / 作者:torry / 帖子ID:31304
我们打算做的,就是在骨头龙前面放一个微型黑洞。这里我们不用模型,而是通过一次post process,在GPU上用signed distance field(SDF) + ray marching的方式,把黑洞构造出来。

把它变黑

最简单的,就是在前面放一个黑球。
黑洞是什么颜色的,如果忧郁是蓝色的820 / 作者:torry / 帖子ID:31304
这样的结果显然不对。生硬而粗糙。球的SDF是
  1. [/code] 其中p是中心到测试点的向量,r是半径。所以,黑球可以通过
  2. [code]
复制代码
构造出来。其中pos是测试点位置,bh_center是黑洞中心位置,bh_r是黑洞半径。(这里的黑洞半径是预设的常量,没有用史瓦西半径)
空间扭曲

黑洞的强大引力会造成明显的引力透镜效果。看看艺术家画的黑洞,长这个样子:
黑洞是什么颜色的,如果忧郁是蓝色的127 / 作者:torry / 帖子ID:31304
利用ray marching,我们可以模拟一个从眼睛出发,以固定步长一步步往前走的“射线”。而在每一次往前走的过程中,我们都需要对前进方向做一定的修正,让它像被黑洞吸引一样。这里只用到中学都学过的牛顿引力定律。假设一个“光子”的质量和黑洞的质量,通过
黑洞是什么颜色的,如果忧郁是蓝色的232 / 作者:torry / 帖子ID:31304就能计算出黑洞对那个射线的引力。
经过修正后的ray marching后,我们的场景看起来像那么回事了。
黑洞是什么颜色的,如果忧郁是蓝色的361 / 作者:torry / 帖子ID:31304
黑洞周围的光线被扭曲,就好像经过一个透镜一样看到后面的物体。
吸积盘

白矮星、中子星的周围都有吸积盘,黑洞也得有。这里模拟的是一个以黑洞为中心的圆环结构。这个结构仍然可以用SDF来表示:
[code][/code]对每个点用这个函数算distance,就可以知道该点是否落在吸积盘上。如果是的话,就叠加一个亮点。最后的效果不在只有个球。
黑洞是什么颜色的,如果忧郁是蓝色的943 / 作者:torry / 帖子ID:31304
需要注意的是,虽然这个圆环是在黑洞”赤道”平面上,但因为光线受到扭曲,看起来就好像黑洞边缘也有一圈。在制作《星际穿越》的时候,这个效果一开始被以为是个bug,但负责物理支持的人算了以后发现,那是正确的。

发光

目前这个效果看起来有点意思了,但还没有电影里的来的突出。主要就是对比度还不够。所以很简单,加上glow就行了。Glow的强度随着离黑洞中心的距离变大而二次方衰减。
黑洞是什么颜色的,如果忧郁是蓝色的407 / 作者:torry / 帖子ID:31304
有点像了吧。但这个吸积盘显得太光滑了。
加入噪声

给吸积盘加上一个噪声纹理,能更像电影里的效果。噪声纹理的坐标可以根据时间变化,以得到绕黑洞旋转的效果。
黑洞是什么颜色的,如果忧郁是蓝色的404 / 作者:torry / 帖子ID:31304
对比一下题图里来自《星际穿越》的ray tracing离线渲染。那可是要超过40分钟才能达到的,而我们这里可以超过60FPS。
总结

我们用ray marching代替ray tracing,在实时的情况下模拟出了“基于物理”的黑洞特效。这个特效只是个post process,可以很容易地移植到任何图形程序中。完整代码可以在https://github.com/gongminmin/KlayGE/blob/develop/KlayGE/Samples/media/PostProcessing/BlackHolePP.fxml 找到。
但现在还有个问题。因为黑洞特效是通过全屏post process实现的,不考虑遮挡。所以如果黑洞在物体后面,就会出现错误的效果。
黑洞是什么颜色的,如果忧郁是蓝色的683 / 作者:torry / 帖子ID:31304
在正在开发的KlayGE 4.10里,将会加入volumatric post process的支持。那时候,post process就不一定是个全屏特效了,可以帮在某个具体物体上,只需要处理局部,并保持场景原有的遮挡效果。这样可以避免出现这个问题,并能大幅度提高性能。
online_member 发表于 2018-6-13 20:21:40 | 显示全部楼层
被题目吸引进来
online_member 发表于 2018-6-13 20:21:40 | 显示全部楼层
羽泉 叶子
online_member 发表于 2018-6-13 20:21:40 | 显示全部楼层
GTX 960 瞩目
online_member 发表于 2018-6-13 20:21:40 | 显示全部楼层
证明我真的是用GTX 960
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

UFO中文网

GMT+8, 2024-11-19 22:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表