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.
相关文章推荐
- Q79:怎么用三角形网格(Triangle Mesh)细分曲面
- Q82:三角形网格[Triangle Mesh]图形的平滑着色[Smooth Shading]
- opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色
- Q100:怎么用三角形网格细分回旋体(rotational sweeping / revolution)
- Q97:怎么用三角形网格细分Bezier曲面——以Utah Teapot为例
- 【CG】OpenGL3.3+IMGUI_绘制三角形并着色
- 怎么去除visio的网格线
- js怎么判断字符串中只有数字和小数点-待补充
- 浅谈管理软件开发类项目是怎么来的,怎么接到项目的,欢迎大家补充
- Maya: 菜单 网格 >三角形化
- Android OpenGL ES(二)----平滑着色
- NAV导航网格寻路(5) -- 生成网格的一些补充
- DirectX学习笔记(五):利用平面着色和Gouraud着色模式绘制具有颜色的三角形
- visio2013中的网格线怎么去除
- windows环境下80端口被占用怎么办?windows下杀端口进程
- 怎么在ZBrush中插入多网格
- nginx怎么启动平滑重启关闭
- 怎么用MathType编辑大三角形符号
- 怎么在PS中画三角形
- 教你怎么合理补充微量元素