Rendering Basics of Ray Tracing

引言

太极图形课会分成「太极」语言与计算机「图形学」两部分。前半部分主讲太极编程语言的基础语法,高级用法,以及调试和优化太极程序的方式。后半部分侧重于图形学知识,我们将以实践者的角度来聊一聊基于太极语言的渲染和仿真。

光线追踪基本概念

What can we get from a ray tracer

我们的 ray tracer 包括光源、镜面材质、介电质、漫反射材质,不同的材质会呈现出不同的结果:

在半透明的球上面可以看到全反射、聚光斑,地上的阴影也是软阴影,这些都是我们想要呈现的效果。

Rendering techniques

光追的另一种方法是光栅化。一般我们会把渲染管线分为两大类来处理:

  • 实时效果 更多考虑光栅化进行渲染
  • 光线追踪渲染更多追求 渲染效果

What I’ve been playing recently:

包括最近的《仙剑7》拥有开光追的选项,上图可以比对光栅化和光线追踪的效果,比如反光表面细节会更丰富一些,水潭的反射投影也会更好,画面整体给人感觉更明亮一些。

Why ray tracing?

  • It provides us nicely-looking pictures
  • It is conceptually easier to understand

光线追踪可以产生更漂亮的图片,做图形学很多也就图个漂亮。

The Cornell Box

这是陈列在美国康奈尔大学的一个盒子,如果我们放入两个盒子:

左边的图是实拍的,右边的图是渲染的,可以发现已经非常接近了,也是我们做渲染的初衷。

How do we see the world

我们的眼睛可以感知到这个世界。

这个世界有许多光源,光源会把光打到一些物体上面,这些物体会把光线反射到你的眼睛里面,然后你就可以看到这个物体了。

当然,我们也可以在眼前放一块幕布,所有的光线打到幕布上,我们只看幕布其实和看真实世界没什么区别,这和看电影是类似的。

How do we see the (virtual) world

渲染也是一样。我们在虚拟世界设置光源打出光线,兔子传到虚拟世界的眼睛–相机上:

这条 right ray 有起点和方向,如果恰好打到我们的眼睛就可以看到这条光线和带来的信息。

Assumptions of the light rays

光线追踪的基本假设:

  • 所有的光都是走直线(几何光学的解释),现实中光因为波粒二象性可以衍射走弯路
  • 光和光没有碰撞
  • 光路可逆

How to we see the world (from Empedocles)

有一个非常古老的传统学说:发射说,这个学派用触觉类比视觉。这个哲学观点非常淳朴,但非常符合我们在光线追踪中的思想。

The ultimate question in rendering:

在渲染中经常遇到的一个问题是这个 pixel 长什么样子,像素是什么颜色?虚拟世界中我们可以把屏幕架到相机前面去,从眼睛的方向发射一条指定的光线去问这条光线看到的是什么颜色。

def color(ray_origin, ray_direction):
col = ti.Vector([0.0, 0.0, 0.0]) # do something
return col

光线追踪到底在追什么

Option I: color

Fill the color of the first hit object

我的眼睛在屏幕前面,我可以从眼睛前射出几条光,通过幕布上的某些像素打到物体上面告诉我是灰的,那么我就在屏幕上画灰的;我也可以从眼睛发出光打到光源上面,光源告诉我是白的,那么我们就可以把白点画在这个地方。

Usually done with (perspective) projections

Returns flat-looking results

结果看起来非常平,它没有让我们直观上感觉到三维的东西。

We cannot tell the materials using their colors

我们感受到的颜色不单单只是物体表面的颜色。

A and B, which one is “whiter”?

what you see = color * brightness

我们看到的可以认为是一个颜色和一个亮度的叠加。

“Let there be light shading”

Option II: color + shading

The Lambertian reflectance model

Why the cos(θ)?

The larger cos(θ), the higher energy/area

Looks like 3D!

How about the specular surfaces?

The Phong reflectance model

The Blinn–Phong reflectance model

Shining! But floating!

Option III: the Whitted-style ray tracer

The Whitted-style ray tracer
What color does the ray see?
Shadows!
Shadow! Mirror! Dielectric!

Option IV: the path tracer