Rendering Course by Wangningbei
引言
偶然间发现了王贝贝老师的渲染课程录播,虽然只更新了五篇但还是特开一篇文章用以复习回顾。
渲染入门
Lec1
场景与渲染

材质描述的是几何体本身和光发生作用的时候呈现的颜色。
渲染过程涉及两个方面:
- 着色 Shading
- 光线传输 Light Transport:光线在场景中多次反弹的过程
ShaderToy示例
几何体

这些形状到底是怎么形成的?
- 显式:三角形、四边形等离散的
- 隐式:写方程得到的(数据量小,相交求解方便)
隐式表面

1 | float Scene(vec3 p, mat3 localToWorld) |
显式表面

隐式表达 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)

1 | Intersect(Ray ray, BVH node) { |
光线与三角形求交(简单方案)

光栅化 vs 光线追踪

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

Lec2
各种各样的材质

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

材质的主要分类

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

Shading Normal

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


