画家算法:从远到近的光栅化,近的物体的着色覆盖远的物体的着色,近的物体的RGB优先
实际计算机图形学使用的是Z-Buffer深度缓冲
先看地板,地板要渲染的像素先放进二位数组内,接下来要看正方体,正方体与之前地板的像素位置要近,那么将对应的地板像素的二位数组像素给覆盖成正方体的像素吗,如下图:
小正方形内的数字代表距离相机的远近程度,越近的就将远的像素信息给覆盖掉
r是离光源的半径,离光源越远,Ld(漫反射光源的强度,其他各种光照通过各种反射最后到该位置的亮度强度)值越小,由于n, l为单位向量,n与l的点集就为n的模乘以l的模乘以cos,则角度越小,接触的通光量则越少,则光亮度越弱,由于不考虑光线折射,cos角度大于180的场景(大于180°后点集值为负),所以做了一个max(0, n ^ l)的操作,Kd是漫反射的颜色
上图为颜色强度越来越强的效果图
现在给Ls(高光向光源强度,最亮的光源到该位置的亮度)增加一个系数p,目的是防止太远的物体也能受到反射光的影响,如下图,将cos的幂提高即可有效满足远处物体不受反射光效果影响的目的
最后一个就是收到环境光的影响La,相当于整个环境都存在一个常量的光,让整个场景不至于一点东西都看不见而存在的La
由La(环境光)+ Ld(漫反射光)+ Ls(高光)综合相加而决定的最后的光照强度
渲染管线:
1、通过各种Rotation、Scale、Translation等操作过后生成各个三维的空间
2、通过相机把三维空间位置先压缩到单位为2的正方体内
3、将正方体内的空间通过[ width / 2, 0, 0 width / 2 ]的矩阵将三维空间的X,Y轴上的点变换到屏幕
[ 0, height / 2, 0, height / 2 ]
[ 0, 0, 1, 0 ]
[ 0, 0, 0, 1 ]
4、再次通过Z-Buffer的算法将Z轴的坐标,画到屏幕上
5、通过采样,将要渲染的像素进行标示出来,由于采样会由锯齿,所以通过模糊再采样的形式减少抗锯齿带来的视觉影响。
6、shader着色(考虑环境光、漫反射光、强光影响),将RGB颜色画在各个像素上完成渲染管线
Texture Mapping(纹理映射):