《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?
一、在顶点处理阶段,计算出了三角形每个顶点的光照,那么三角形所覆盖的每个像素的光照值如何得到?
光栅化阶段可得到
二、Shading (明暗处理、着色)
Shading:计算三角形内每个像素的颜色的过程
几种常见处理方法
常数明暗处理
Gouraud明暗处理(Guoraud shading)
Phong明暗处理(Phong shading)
三、常数明暗处理
在默认的图形流水线中,由于效率的原因,光照计算是为了每个顶点进行的。
那么,面片内每个片元的颜色如何计算?
最简单的方法(常数明暗处理):面片内所有像素都取同样的颜色
1.“常数明暗处理”:即对每个多边形只计算一个光照强度值,然后用此值作为整个多边形平面的明暗值赋给多边形的每个像素,使多边形的每个点都具有相同的明暗度。
2.如何消除颜色的跳变,实现光滑明暗处理?
3.如何实现更光滑的明暗处理?
(1)“常数明暗处理”:即对每个多边型只计算一个光照强度值,然后用此值作为整个多边形平面的明暗值赋给多边形的每个像素,使多边形的每个点都具有相同的明暗度。
(2)如何消除颜色的跳变,实现光滑明暗处理?
四. 光滑明暗处理
消除颜色的跳变,实现光滑的明暗处理:
1.Gouraud明暗处理
采用“双线性插值”的方式计算面片内像素的颜色,具体做法是:
1.计算出多边形各顶点的法向(对周围面片法向进行平均求得此顶点的法向);
2.计算出多边形各顶点处的光亮度值;
3.然后再对多边形顶点的光亮度进行“双线性插值”计算出多边形内任一片元的光亮度。
Step1:计算出多边形各顶点的法向
对周围面片法向进行平均可求得此顶点的法向
Step2:计算出多边形各顶点处的光亮度值;
Step3:然后再对多边形顶点的光亮度进行“双线性插值”计算出多边形内任一片元的光亮度。
双线性插值
沿当前扫描线进行线性插值
(1)先插值计算出a,b两点的光亮度
(2)再由a,b两点的光亮度值插值计算出P点的光亮度值
这种插值计算发生在什么时候?
在“光栅化”过程中,会对多边形进行扫描转换。此时正好就可在扫描过程每个片元进行双线性插值。
五、三个步骤的发生阶段
三个步骤:
Step1:计算出多边形各顶点的法向
(对周围面片法向进行平均求得此顶点的法向); -------CPU
Step2:计算出多边形各顶点处的光亮度值 ;
-------Vertex operation
Step3:然后再多边形顶点的光亮度值进行“双线性插值”计算出多边形内任一片元的光亮度。
--------Rasterization
六、再次观察流水线
OpenGL中的Shading: