引言
偶然间发现了王贝贝老师的渲染课程录播,虽然只更新了五篇但还是特开一篇文章用以复习回顾。
渲染入门
Lec1
场景与渲染
材质描述的是几何体本身和光发生作用的时候呈现的颜色。
渲染过程涉及两个方面:
- 着色 Shading
- 光线传输 Light Transport:光线在场景中多次反弹的过程
ShaderToy示例
几何体
这些形状到底是怎么形成的?
- 显式:三角形、四边形等离散的
- 隐式:写方程得到的(数据量小,相交求解方便)
隐式表面
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)
Intersect(Ray ray, BVH node) { |
光线与三角形求交(简单方案)
光栅化 vs 光线追踪
- 光栅化:速度快,全局光照、阴影等处理方式繁琐
- 光线追踪:准确,擅长镜面反射、阴影,计算全局光照、阴影等思路简单但是耗时
小结
Lec2
各种各样的材质
现实世界中有各种各样的不同材质,材质该如何表达呢?
材质的主要分类
材质是一个关于入射光和出射光的函数,双向反射分布函数(Bidirectional Reflection Distribution Function,BRDF)
BRDF
Shading Normal
着色是在局部坐标系下的,三角面片的割裂导致了右图的渲染效果。