着色 shading
实现近大远小的效果。
画家算法
远处的画完(光栅化),再画近处的,覆盖掉远处的一部分。
时间复杂度:排序每个三角形,nlogn
但下面这种情况就无法用画家算法:
因此用深度缓冲 z-buffer
z-buffer深度缓存
(目前一般采用的方法)
时间复杂度 O(N),与排序无关!!每次存最小的,没有判断其他三角形的关系
生成两个,frame buffer(最后渲染结果) + depth buffer(z-buffer) 深度信息
之前:相机往-z看,小代表离得远,大代表离得近;
这里为简化计算,越小表示越近,越大表示越远。
右图,深度图,离得近,深度浅,对应值小,要黑一点;离得远,深度大,更白。
算法步骤
按像素计算。比较每个像素的深度,同时更新深度图。(中心思想:让深度图存每个像素比较后最浅也就是最近的那个值)
framebuffer[x,y] = rgb(把该像素赋值成新的三角形的颜色)
例子:
目前学的内容:
模型通过变换变成某种姿势、定义一个相机——视图变化、相机放在000,往 -z 看——三维投影到二维屏幕——根据屏幕和投影变换的关系,知道三角形会在屏幕上覆盖哪些坐标。
着色定义
引入颜色和光照的不同。
最基础着色模型 (binn-phong反射模型)
再这一点上只考虑它自己和光线,不考虑其他任何物体的存在,不考虑阴影。
漫反射 diffuse reflection
均匀的反射到四面八方。
shading point 接收到的光:和 cos theta成正比。
点光源有多少光会传到shading point:
推导出漫反射:
kd:代表shading point的颜色,rgb,比如000代表是黑色,吸收掉所有光,111是白色,shading point 不吸收光。
max(0,向量n点乘向量l即cos theta):指如果有光从下面到上面,是负的 点乘结果是负的情况,(这里只考虑漫反射,不考虑折射的存在)。
可以看出漫反射和观测方向 v 无关,即漫反射在任何方向观测都一样。