Rendering Course by Wangningbei

引言

偶然间发现了王贝贝老师的渲染课程录播,虽然只更新了五篇但还是特开一篇文章用以复习回顾。

渲染入门

Lec1


场景与渲染

材质描述的是几何体本身和光发生作用的时候呈现的颜色。

渲染过程涉及两个方面:

  • 着色 Shading
  • 光线传输 Light Transport:光线在场景中多次反弹的过程
ShaderToy示例

几何体

这些形状到底是怎么形成的?

  • 显式:三角形、四边形等离散的
  • 隐式:写方程得到的(数据量小,相交求解方便)
隐式表面

float Scene(vec3 p, mat3 localToWorld)
{
p = p * localToWorld;

// ring
vec3 t = p;
t.y -= -.7;
float r = Substract(Disc(t, 0.9, .1), Cylinder(t, .7, 2.));
vec3 t2 = t - vec3(0., 0., 1.0);
Rotate(t2.xz, 0.25 * MATH_PI);
r = Substract(r, Box(t2, vec3(.5)));
r = Union(r, Disc(t + vec3(0., 0.05, 0.), 0.85, .05));

t = p;
Rotate(t.yz, -.3);

// body
float b = Sphere(t, .8);
b = Substract(b, Sphere(t - vec3(0., 0., .5), .5));
b = Substract(b, Sphere(t - vec3(0., 0., -.7), .3));
b = Substract(b, Box(t, vec3(2., .03, 2.)));
b = Union(b, Sphere(t, .7));

float ret = Union(r, b);
return ret;
}
显式表面

隐式表达 vs 显式表达

各种文件类型

  • .obj:比较通用,但压缩上非常差
  • .fbx:Unreal 或者 Unity 引擎可直接使用
一个模型究竟包含了哪些信息呢?

  • 一些点、点和点之间如何相连(拓扑关系)
  • 点(vertex):位置、法向(normalized)、uv 坐标等
  • 拓扑:这些点组合成 polygon(三角形)
物体坐标系和世界坐标系

相机(camera/sensor)

正交(orthographic) vs 透视(perspective)

透视投影

相机坐标系

渲染常见有两种方式:光栅化光线追踪

需要说明的是这两种方法和是否使用 CPU、GPU 无关,看的是有没有硬件的支持。

光栅化(rasterization)

以物体为中心,遍历所有的物体(三角形)向屏幕投影。

  • 通过 zbuffer 确定显示哪个点
  • 光栅化从很久很久以前就有硬件支持了,比如 OpenGL、Direct3D 等
光线追踪(ray tracing)

  • 以屏幕为中心,遍历所有的像素,发射光线与场景求交
  • 对光线追踪的硬件支持时间上晚于光栅化(从 Optix 2010 年开始,DX12 开始支持是近几年的事情)
  • 为什么?因为光线追踪太费了
为什么说光线追踪太费了呢

光线与场景求交:找到光线与场景中某个三角形的交点

  • 发射光线
  • 先找到三角形
  • 找到交点

如何找到三角形?可以遍历一遍(O(n));也可以借助于空间数据结构如 KD tree、BVH 等等(O(logn))。

光线与场景求交

包围盒(bounding box)

光线与三角形求交(BVH)

Intersect(Ray ray, BVH node) {
if (ray misses node.box) return;

if (node is a leaf node)
test intersection with all objs;
return closest intersection;

hit1 = Intersect(ray, node.child1);
hit2 = Intersect(ray, node.child2);

return the clser of hit1, hit2;
}
光线与三角形求交(简单方案)

光栅化 vs 光线追踪

  • 光栅化:速度快,全局光照、阴影等处理方式繁琐
  • 光线追踪:准确,擅长镜面反射、阴影,计算全局光照、阴影等思路简单但是耗时
小结

Lec2


各种各样的材质

现实世界中有各种各样的不同材质,材质该如何表达呢?

材质的主要分类

材质是一个关于入射光和出射光的函数,双向反射分布函数(Bidirectional Reflection Distribution Function,BRDF)

BRDF

Shading Normal

着色是在局部坐标系下的,三角面片的割裂导致了右图的渲染效果。

Lec3


全局光照

Lec4


Lec5