1.着色频率
根据不同的着色方式,有不同的着色频率,主要的着色频率分为三种——面着色,顶点着色和像素着色。主要的不同之处在于法线的选择方式不同。
- 面着色 Flat Shading指的是计算每一个三角形平面的法线后对一个平面整体进行着色;
- 顶点着色 Gouraud Shading 指的是计算每一个三角形三个顶点的法线后进行着色,最后在三角形内部插值得到颜色。顶点法线的计算是通过顶点相邻面的法线的(加权)平均值求出;
- 像素着色 Phong Shading指的是计算出每一个像素的法线进行着色。三角形内部点法线的计算需要依靠重心坐标计算。
当几何体相对复杂,构造精细的时候,三种着色效果产生的结果不相上下。
2.渲染管线
管线 Pipeline是从模型到图片生成的过程。管线分为以下过程:
首先将顶点的三位向量作为输入,进行几何变换(mvpMatrix)后划分三角形区域。通过光栅化获得一个个小的碎片(或者是一个个小像素)后进行着色,得到我们的输出。
我们可以定义顶点或者像素的着色方式来提供不同的着色要求,这被称为 Shader。硬件中会提供这样的编程方式定制不同的着色方式,以 OpenGL 为例,我们可以定义以下的着色函数:
uniform sampler2D myTexture ;
uniform vec3 lightDir ;
varying vec2 uv ;
varying vec3 norm ;
void diffuseShader () {
vec3 kd ;
kd = texture2d ( myTexture , uv );
kd *= clamp ( dot (- lightDir , norm ) , 0.0 , 1.0) ;
gl_FragColor = (kd , 1.0) ;
}
这里我们定义了一个简单的漫反射着色器。同时,着色器会自动应用到每一个顶点或者是像素上,不需要我们使用显式的 for 循环进行遍历。逐顶点,逐片元就是这个意思。逐个执行上面代码,每个顶点或片元执行的程序都一样。
3.纹理映射
对于任何一个三角形,我们在内部填充一个图形作为纹理。纹理(Texture)也就是我们在不同的位置所定义的漫反射系数。有点初始化片元状态的意思