APP下载

一种高质量实时渲染黑洞的方法

2021-09-23梁瑞尧,张芸祯

电脑知识与技术 2021年21期
关键词:渲染黑洞

梁瑞尧,张芸祯

摘要:黑洞是1915年爱因斯坦广义相对论预言存在的一种天体,它具有的超强引力,使得光也无法逃脱它的势力范围。黑洞可以用爱因斯坦场方程[1]来描述,但爱因斯坦场方程是一组复杂的二阶非线性微分方程,并没有通解。传统渲染黑洞的方法一般是使用离线渲染的方法,例如在电影《星际穿越》中的卡冈图雅黑洞,特效实现就由30个人,数千台计算机耗时一年才完成[2]。本文描述一种高质量实时渲染黑洞的方法,用光线追踪和引力方程,模拟黑洞的空间弯曲效果,用柏林噪声模拟吸积盘,并给出一种简单而美观的相对论喷流模拟方法。这些模拟方法易于实现,可以在PC或移动设备上以较高的帧率运行。

关键词:黑洞;渲染;光纤追踪

中图分类号:TP311     文獻标识码:A

文章编号:1009-3044(2021)21-0165-03

开放科学(资源服务)标识码(OSID):

1 黑洞简介

黑洞由四个部分组成:

1) 奇点,位于黑洞的最中心,体积无限小,质量无限大的点,这两种特性使得奇点的密度无限大,具有很强大的引力,以至于所有掉入黑洞的物质和能量最终都会坍缩和终结于这里。

2) 事件视界,以奇点为中心某一特定半径的球形区域,物质和能量一旦跨越该边界将被黑洞引力吸入奇点,一去不复返。

3) 吸积盘,事件视界之外的气体、星尘在黑洞强大的引力作用下,会朝向黑洞下落。这个过程被称作“黑洞吸积”。由于气体具有一定的角动量,这些气体在下落过程中会形成一个围绕黑洞高速旋转的盘状结构,如同太阳系的各大行星轨道平面一样,这就是黑洞吸积盘。

4) 相对论喷流,吸积盘上的气体、星尘有部分会跨越事件视界落入黑洞,从而产生粒子,能量等从黑洞的两极接近光速喷射而出,形成相对论喷流。

2 传统黑洞的渲染方法

传统渲染黑洞的核心思想是模拟光线在强引力下的传播,计算出光线在传播路径中与场景中的各个点交互产生的颜色值,一般使用光线追踪算法来实现。但在引力作用下,光线不再沿直线传播,而会因为引力透镜效应而产生弯曲,光线的路径可以用爱因斯坦的场方程来描述 :

尽管爱因斯坦方程的形式看起来很简单,但求解比较复杂,并没有通解。但对于一些比较特殊的情况,比如史瓦西解(度规),所对应的几何是一个是静止不旋转、不带电荷之黑洞。 有了史瓦西度规,我们可以对时空距离 积分,算出光子在球坐标系下的路径,例如这篇文章[3]。但这样的方法需要在运行通过数值方法来求解偏微分方程,耗时较高。因此本文提了另 一种比较简单的方法,与传统的黑洞渲染有两个主要的区别:

1) 用Ray Marching方法来替代光线追踪算法,其优点是不在限制光线以直线传播,我们可以选择适当的步长,累积光线路径与场景交互的不同点的颜色;

2) 使用万有引力计算加速度以模拟光线路径弯曲,虽然违背光速不变原则物理规律,但相对于求解爱因斯坦场方程,其计算量较小,只涉及简单乘法和除法。

3 Ray Marching简介

光线步进(Ray Marching)是光线追踪(Ray Tracing)的一种数值实现方法,在屏幕后放置一个相机,从相机发出一条与(下图中蓝色的线)屏幕连上像素点连接的射线。用该射线与场景中的物体作相交检测。 沿着这条射线一步一步往前进,直到光线与场景中的物体相交或者达到最大步数。如果光线与物体相交,则将屏幕上的该像素点设置为交点的颜色。如图1所示,屏幕上该点发出的射线往前走了6步,最终于绿色小球相交,固将该点的颜色设置为绿色。算法伪代码如下:

for(int i = 0;i

{

vec3 p = eye + ray_dir * step;

float hit = HitTest(p); //hit表示距物体的最小距离

step += hit; //ray marhing 光线步进

if(hit < 0.01){

col = vec3(0.);

break;

}

}

4 引力透镜下的Ray Marching

在第三节的Ray Marching的基础上,每次光线步进时都使用万有引力来计算光线的加速度,以使用光线产生弯曲。

可以把屏幕上发出的射线步进想象为由星球发出向前运动的光子,在黑洞的引力作用下,光子的运动轨迹由于加速度不在以直线运动,而是以曲线的轨迹到达相机位置,如图2所示。

· 让光子产生弯曲的引力公式:

· 光子引力加速度

核心代码如下:

for(int i = 0;i

{

p += v * dt;

vec3 relP = p - black_hole_pos; //黑洞相对原点的位置

float r2 = dot(relP,relP);

vec3 a = GM/r2 * normalize(-relP); //加速度方向朝向黑洞,为-relP

v += a * dt;

float hit = HitTest(relP); //hit表示距物体的最小距离

猜你喜欢

渲染黑洞
HAYDON黑洞
5500万光年之外的“黑洞”,是如何被拍到的
黑洞什么样,有图有真相
浅谈三维软件在二维动画渲染中的应用
水墨写意 破晓啼莺
试论电影“渲染”的方式及功用
黑洞
神秘的黑洞
黑洞思