着色
模型-投影变换:物体变为标准立方体中
视口变换:3D物体变为2D平面
光栅化:绘制物体在2D平面上
着色:对物体应用材质 -- apply a material to an object
材质在光照作用下表现出来的颜色
Bling-Phone模型光照会出现的情况:漫反射 + 高光 + 环境光照
Shading Point
考虑的光照最简模型。一个接受光照的平面,其主要有4个参数
法线:n
观测方向:v
光照方向:l
表面属性:(材质)
着色的局部性 着色不会产生阴影,他只考虑物体自己,当在考虑时,会在空间中去掉其他物体
漫反射
光照方向与Shading Point 法线的夹角余弦\(cos\theta = l \cdot n\)决定了光源的吸收情况
点光源的能量在距离上的衰减
点光源周围可以看作为一圈一圈的等势线,距离光源r的点能够接受到的能量为\(I =\frac{I_0}{r^2}\)
Lambertian Diffuse Shading -- 漫反射的计算结果
\[L_d = k_d \cdot \frac{I_0}{r^2} \cdot max(0,n \cdot l) \]\(max(0,n \cdot l)\)表示Shading Point 能够接受到的能量,与0比大小,为了避免余弦为负值带来的无意义情况
\(\frac{I_0}{r^2}\)表示能够到达Shading Point 的能量大小,随着距离衰减
\(k_d\) diffuse coefficient 主要由物体材质决定
可以看出在漫反射计算公式中,并没有考虑观测向量v对结果的影响,因为对于漫反射来说从四面八方看到的结果应该是一样的
高光
观测方向接近镜面反射方向
光照方向在Shading Point 上存在一个镜面反射向量,当该向量与观测方向接近时,将表现出高光
等价于
Shading Point的法线向量与入射向量和观测向量的半程向量(两个向量组成的角的角平分线)接近
p次幂让高光范围减小
环境光照
假设任何点接受到的环境光照是相同的\(I_a\)
\[L_a = k_a \cdot I_a \]Blinn-Phone 着色模型
\[L = L_d + L_s + L_a\\ = k_d \cdot \frac{I_0}{r^2} \cdot max(0,n \cdot l) + k_s \cdot \frac{I_0}{r^2} \cdot max(0,n \cdot h)^p + k_a \cdot I_a \]着色频率
flat shading
利用一个三角形面的法线来计算着色
Gouraud Shading
利用一个三角形的三个顶点法线计算顶点颜色,然后插值计算三角形内部的颜色
for(每个三角形)
{
color P0;
color P1;
color P2;
for(三角形中的每个像素)
{
//计算该像素在三角形中的重心坐标
color pixelc = P0*x + P1*y + P2*z;
setcolor(pixel,pixelc);
}
}
根据三角形面求解顶点法线
一个顶点会被多个三角形面共用,所以该顶点法线就为 每个面法线的平均
\[N_v = \frac{\sum_iN_i}{||\sum_iN_i||} \]Phone Shading
对每个像素通过三角形的三个顶点插值计算法线,然后利用该法线计算每个像素的颜色
for(每个三角形)
{
normal P0;
normal P1;
normal P2;
for(三角形中的每个像素)
{
//计算该像素在三角形中的重心坐标
normal pixeln = P0*x + P1*y + P2*z;
setcolor(pixel,getcolor(pixeln));
}
}
实时渲染管线
- 输入3D空间中的点
- MVP变换 + 视口变换 3D点变到2D平面上
- 点连接为三角形 obj文件有相应的定义
- 光栅化--离散三角形为像素块
- 对像素块着色
- 输出
纹理映射
定义任何一个点的属性,一般存在一个纹理贴图
以obj文件来说,obj文件内可能会定义给出每个顶点的uv坐标,可以通过读取uv坐标值,从而在纹理贴图中寻找到该点的属性。