您的位置:首页 > 其它

Q80:平坦着色(Flat Shading)和平滑着色(Smooth Shading)——“Q79:怎么用三角形网格(Triangle Mesh)细分曲面”(补充)

2017-03-07 12:34 477 查看
 

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.

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: