80.1 概述
前面用三角形网格细分球面时,对单个三角形的着色方式采样的是“Flat Shading”。即:
通过三角形三顶点的坐标计算出整个三角形的法向量。
这样就导致相邻两个三角形的法向量差别很大,所以就能看到明显的三角形的边。
而“Smooth Shading”则是:先计算三角形三顶点处的法向量,然后将这三个法向量线性插值的结果作为整个三角形的法向量。
这样相邻两个三角形的法向量差别就会小很多(因为相邻两个三角形只有一个顶点不同)。
线性差值的方式,我们可以直接使用“判断点是否在三角形内的那些系数”。线性插值公式:
其中的β、γ即是“判断点是否在三角形内的那些系数”。这些系数可以通过三角形的顶点坐标求得。
这样一来,平坦着色是由“Triangle”类完成的(即普通三角形的画法)。
所以,为了实现平滑着色,我们需要定一个画三角形的方式(法向量的求解方式不同了),我们定义新的三角形类“SmoothTriangle”。“SmoothTriangle”和“Triangle”的唯一区别就是“法向量的求解方式”。
80.2 SmoothTriangle的实现
其中参数beta、gamma对应着hit()函数中的那些系数;n0、n1、n2这三个法向量则需要从外面传进来(因为不同曲面求法向量的方式不一样,所以只有将法向量在外面计算好之后再传进来)
关于beta、gamma:
关于n0、n1、n2:
非特殊曲面上某点处法向量的求法:
(这张图是从网上找的,不知道是从什么书上截下来的???)
80.3 测试图形
tessellate_smooth_sphere(8,4)
tessellate_flat_sphere(8,4)
(前一个图形为Smooth Shading,后一个图形为Flat Shading)
tessellate_smooth_sphere(16,8)
tessellate_flat_sphere(16,8)
(前一个图形为Smooth Shading,后一个图形为Flat Shading)
tessellate_smooth_sphere(160,80)
tessellate_flat_sphere(160,80)
(前一个图形为Smooth Shading,后一个图形为Flat Shading)
tessellate_smooth_sphere(1600,800)
tessellate_flat_sphere(1600,800)
(前一个图形为Smooth Shading,后一个图形为Flat Shading)
80.4 其他说明
完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9772259
Referrance
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.