Q80:平坦着色(Flat Shading)和平滑着色(Smooth Shading)——“Q79:怎么用三角形网格(Triangle Mesh)细分曲面”(补充)
来源:互联网 发布:毛姆读书随笔 知乎 编辑:程序博客网 时间:2024/05/02 06:12
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.
- Q80:平坦着色(Flat Shading)和平滑着色(Smooth Shading)——“Q79:怎么用三角形网格(Triangle Mesh)细分曲面”(补充)
- Q79:怎么用三角形网格(Triangle Mesh)细分曲面
- Q82:三角形网格[Triangle Mesh]图形的平滑着色[Smooth Shading]
- Flat Shading (平面着色)
- OpenGL进阶(十二) - 基础着色(Shading)
- OpenGL进阶(十二) - 基础着色(Shading)
- 着色语言 Shading Language(一)
- 着色语言 Shading Language(二)
- GLSL-Flat Shading平面着色
- Tessellation Shader(细分曲面着色器)
- 问题六十八:着色模型(shading model)(2)——光照模型(Light model)
- Deferred Shading(延迟着色) 简述与实现
- 【OpenGL4.0】GLSL-Flat Shading平面着色
- 【OpenGL4.0】GLSL-Flat Shading平面着色
- 【OpenGL4.0】GLSL-Flat Shading平面着色
- 【OpenGL4.0】GLSL-Flat Shading平面着色
- OpenGL 4.0的Tessellation Shader(细分曲面着色器)
- Ogre着色方式和光照模型(shading mode vs lighting model)
- SQL优化:优化层次、途经、最佳实践
- visual studio 2013入门-----制作小型电脑应用程序(连接mysql数据库)
- UGUI中的DrawCall
- LeetCode之Number Complement
- 1280: Divisible
- Q80:平坦着色(Flat Shading)和平滑着色(Smooth Shading)——“Q79:怎么用三角形网格(Triangle Mesh)细分曲面”(补充)
- Android中线程与Handler简单交互
- swift3.1(1)The Basics
- Unity学习笔记(组件篇1) Unity AudioSource组件的扩展使用
- 前端切图PS技能
- EditText不能获取文本问题
- ES6新属性笔记
- hdu 2196 Computer(树形DP)
- Web存储storage、cookie的综合使用