Computer Graphics 03
Ray Tracing
Why Ray Tracing?
- rasterization : real-time,ray tracing: offline
- ray tracing is accurate,but is very slow
Whitted-Style Ray Tracing
渲染3d物体时计算机图形的工作之一。
同一场景的物体渲染需要考虑每个物体贡献的像素。
有两种常规的方法来考虑
- object-order rendering ,通过找物体来计算对应像素
- image-order rendering,通过找像素来判断物体,然后计算像素
差别可以这么来看
前者双重循环外循环是物体,后者则是像素
宽泛来说,image-order rendering 是更加简单和灵活的,一般来说也会有更长的执行事件来制造同样的图片。
Ray Tracing 就是image-order algorithm因为这样不需要像前者一样用数学器械就能实现光线追踪器。
The Basic Ray-Tracing Algorithm
基本的光线追踪器有三个部分
某种意义上,在引擎中,可以认为“眼睛发光”
ray generation. 计算每个像素的view射线的来源和方向
ray intersection. 计算与view射线相交的最近物体
shading. 在原有的射线相交的基础上进行着色
Perspective
标准的方法来为计算机图形,艺术和照片制作图片,是使用linear perspective(线性透视)
parallel projection(平行投影)是最简单的投影方式,平移。一般用于机械和建筑
如果image plane和视线方向垂直,成为orthograph(正交投影) orthonormal(正交的)
Compute View Ray
phase 1
为了生成ray,我们首先需要一个数学表达
p(t) = e + t(s- e)
e is eye, s is image plane point
在代码中
详情见P84
Orthographic Views
对于正交投影view ray,
ray generation 使用相机的框架,
正交投影从image plane的一个像素的位置开始,并且全部共享相同的方向—-view direction.
而透视投影则是选择一个view point 开始,方向则是view point 到image plane的点的位置。
要将nx ny 的像素投射到(r - l) x (t - b)的矩形上
其中l,r分别是片元,pixel的左右边界坐标,b和t则是下、上边界坐标
详情见P86
Perspective Views
Ray-Object Intersection
phase 2
Ray-Sphere Intersection
使用implicit surface
隐式表达式f(p(t)) = 0或者f(e + td) = 0
对于一个球来说,设中心点为c
(p - c)(p - c) - R^2 = 0
注意,当满足上式,说明p对应的点已经在球上,也即intersection
(e + t d - c)(e + td - c) - R^2 = 0
只有t未知
展开得到quadratic 二次方程,判别式b^2 - 4ac
Shading
Here we will discuss how a ray tracer computes the inputs to shading
1.从点光源和直线光计算着色需要具体的几何信息。当viewing ray 确定与表面相交,我们需要决定以下4个向量。
- 着色点x可以通过估算viewing ray 以t的值相交
- 表面的法线向量n
- 光源方向l
- 视觉射线viewing direction 是viewing ray的反方向(v = -d/|d|)
2.coding
3.一旦你已经在光线追踪器上有基本的着色后,光线和点阴影添加会很容易
使用directional light 的阴影与点光源类似,但是t=无穷,也即距离无穷,环境光不进行阴影测试(shadow test)
4.Mirror Reflection(镜面反射)
为光线追踪程序添加镜面发射(or specular reflection) 很直接。
由视线计算反射光向量,易得
r = d - 2(d*n)*n
其中r是反射向量,d是view(视线)入射的向量
在现实世界中,当光线从表面反射出去,一定会有能量损失
由于光线颜色不同,损失也会不一样,这里使用递归算法(recursive)
调用shader-ray函数。
color c = c + k * shader-ray(Ray(p,r),t,infinity)
k是specular rgb color, 并且t = infinity,和shadow一样。因为并不想让光线反射到光源上
Frequently Asked
为什么ray tracing 中没有透视矩阵
可以实现交互式光线追踪吗
对于充分小的模型和图片,任何现代pc都足以支持可交互式光线追踪。现实中,对于全屏的实现,多cpu共享帧缓存区是需要的。
计算机算力进步比屏幕分辨率更快,让传统pc在屏幕分辨率下实现复杂场景光线追踪只不过是时间问题。
ray tracing在硬件图形程序中有用吗
光线追踪经常用于采集,当用户点击鼠标3d图形程序的像素,程序需要决定哪个物体的显示。