《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

一、在顶点处理阶段,计算出了三角形每个顶点的光照,那么三角形所覆盖的每个像素的光照值如何得到?

光栅化阶段可得到

二、Shading (明暗处理、着色)

Shading:计算三角形内每个像素的颜色的过程

几种常见处理方法

常数明暗处理

Gouraud明暗处理(Guoraud shading)

Phong明暗处理(Phong shading)

三、常数明暗处理

在默认的图形流水线中,由于效率的原因,光照计算是为了每个顶点进行的。

那么,面片内每个片元的颜色如何计算?

最简单的方法(常数明暗处理):面片内所有像素都取同样的颜色

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

1.“常数明暗处理”:即对每个多边形只计算一个光照强度值,然后用此值作为整个多边形平面的明暗值赋给多边形的每个像素,使多边形的每个点都具有相同的明暗度。

2.如何消除颜色的跳变,实现光滑明暗处理?

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

3.如何实现更光滑的明暗处理?

(1)“常数明暗处理”:即对每个多边型只计算一个光照强度值,然后用此值作为整个多边形平面的明暗值赋给多边形的每个像素,使多边形的每个点都具有相同的明暗度。

(2)如何消除颜色的跳变,实现光滑明暗处理?

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

四. 光滑明暗处理

消除颜色的跳变,实现光滑的明暗处理:

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

1.Gouraud明暗处理

采用“双线性插值”的方式计算面片内像素的颜色,具体做法是:

1.计算出多边形各顶点的法向(对周围面片法向进行平均求得此顶点的法向);

2.计算出多边形各顶点处的光亮度值;

3.然后再对多边形顶点的光亮度进行“双线性插值”计算出多边形内任一片元的光亮度。

Step1:计算出多边形各顶点的法向

对周围面片法向进行平均可求得此顶点的法向

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

Step2:计算出多边形各顶点处的光亮度值;

Step3:然后再对多边形顶点的光亮度进行“双线性插值”计算出多边形内任一片元的光亮度。

双线性插值

沿当前扫描线进行线性插值

(1)先插值计算出a,b两点的光亮度

(2)再由a,b两点的光亮度值插值计算出P点的光亮度值

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

这种插值计算发生在什么时候?

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

在“光栅化”过程中,会对多边形进行扫描转换。此时正好就可在扫描过程每个片元进行双线性插值。

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?

五、三个步骤的发生阶段

三个步骤:

Step1:计算出多边形各顶点的法向

(对周围面片法向进行平均求得此顶点的法向); -------CPU

Step2:计算出多边形各顶点处的光亮度值 ;

-------Vertex operation

Step3:然后再多边形顶点的光亮度值进行“双线性插值”计算出多边形内任一片元的光亮度。

--------Rasterization

六、再次观察流水线

OpenGL中的Shading:

《图形编程技术学习》(三十四)常数明暗处理与Gouraud明暗处理?