├── .nojekyll
├── 00~图形学基础
├── 00~计算几何
│ └── README.md
├── README.md
├── 02~几何变换
│ ├── 99~参考资料
│ │ └── 2023-视图变换(投影变换,视口变换).md
│ ├── 齐次坐标
│ │ └── 99~参考资料
│ │ │ ├── 2020~齐次坐标与投影几何.md
│ │ │ └── 2017~齐次坐标入门级思考.md
│ ├── 仿射变换
│ │ ├── 二维仿射变换
│ │ │ ├── 99~参考资料
│ │ │ │ └── 2020-一文搞懂仿射变换.md
│ │ │ └── README.md
│ │ └── 三维仿射变换
│ │ │ └── README.md
│ ├── 投影变换
│ │ └── README.md
│ └── README.md
├── 01~几何表示方法
│ ├── 隐式表面
│ │ └── SDF
│ │ │ └── README.md
│ ├── 三维对象表示
│ │ ├── 三维建模
│ │ │ ├── README.md
│ │ │ └── UV 展开.md
│ │ ├── Polygonal Mesh
│ │ │ └── README.md
│ │ ├── 三维模型格式
│ │ │ └── README.md
│ │ ├── 体素.md
│ │ └── README.md
│ ├── 直线.md
│ └── README.md
└── 99~参考资料
│ └── 2024~Understanding 3D Graphics.md
├── 03~图形绘制库
├── Vulkan
│ └── README.md
├── Web 图形绘制
│ ├── WebGL
│ │ └── README.link
│ ├── WebGPU
│ │ └── README.link
│ ├── Three.js
│ │ ├── README.link
│ │ └── .DS_Store
│ └── Canvas
│ │ ├── 图片处理.md
│ │ └── README.md
├── .DS_Store
├── OpenGL
│ ├── 99~参考资料
│ │ ├── 《Learn OpenGL》笔记
│ │ │ └── README.md
│ │ └── 2022~Introduction to GPUs with OpenGL.md
│ └── README.md
└── README.md
├── INTRODUCTION.md
├── 01~真实感渲染
├── 03~渲染管线
│ ├── README.md
│ ├── 99~参考资料
│ │ └── 2021~细说图形学渲染管线.pdf
│ └── 顶点变换
│ │ └── 99~参考资料
│ │ ├── 2021~三维相机入门.md
│ │ └── 2021~渲染管线中的顶点变换.md
├── 00~概述
│ ├── 发展历史.md
│ └── 学科方向.md
├── .DS_Store
├── 04~光线追踪
│ └── BVH
│ │ └── 99~参考资料
│ │ └── 2020~BVH 树的构建.md
├── 99~参考资料
│ ├── 2020~《GAMES 101》课程笔记
│ │ ├── README.md
│ │ ├── 02~Review of Linear Algebra.md
│ │ ├── 01~Overview of Computer Graphics.md
│ │ ├── 03-04~Transformation.md
│ │ ├── 17~Materials and Appearances.md
│ │ ├── 05-06~Rasterization.md
│ │ ├── 21-22~Animation.md
│ │ ├── 10-12~Geometry.md
│ │ ├── 07-09~Shading, Pipeline and Texture Mapping.md
│ │ ├── 13-15~Ray Tracing.md
│ │ ├── 19-20~Cameras, Lenses and Light Fields.md
│ │ └── 18~Advanced Topics in Rendering.md
│ └── 2024~《Implementing a tiny CPU rasterizer》
│ │ └── README.md
└── README.md
├── 99~参考资料
├── 2023~孔令德~《计算机图形学(微课版)》
│ ├── README.md
│ ├── 04~二维图形变换
│ │ ├── 4.1~数学基础.md
│ │ ├── 4.2~基本变换.md
│ │ └── 4.3~组合变换.md
│ ├── 06~三维图形学基础
│ │ ├── 6.3~裁剪.md
│ │ ├── 6.1~三维图形的几何变换.md
│ │ ├── 6.2~三维图形的投影.md
│ │ └── 6.4~三维图形的输出流程.md
│ ├── 07~三维物体的表示
│ │ ├── 7.2~二次曲面.md
│ │ └── 7.1~平面物体的表示.md
│ ├── 08~真实感图显技术
│ │ ├── 8.1~颜色模型.md
│ │ ├── 8.2~光照模型.md
│ │ ├── 8.4~纹理映射.md
│ │ ├── 8.5~透明性.md
│ │ ├── 8.3~阴影的生成.md
│ │ ├── 8.6~隐藏线的消除.md
│ │ └── 8.6~隐藏面的消除.md
│ ├── 01~绪论
│ │ └── 1.1~计算机图形学的研究内容.md
│ ├── 02~二维图形生成技术
│ │ ├── 2.1~直线的生成.md
│ │ ├── 2.2~圆的生成.md
│ │ ├── 2.3~椭圆的生成.md
│ │ ├── 2.4~曲面与曲线.md
│ │ ├── 2.5~输出图元的属性.md
│ │ └── 2.6~字符的生成.md
│ ├── 03~二维实面积图形的生成
│ │ ├── 3.1~矩形填充.md
│ │ ├── 3.2~区域填充.md
│ │ └── 3.3~图案填充.md
│ ├── 05~二维图形的裁剪
│ │ ├── 5.1~图形的开窗.md
│ │ ├── 5.2~线段裁剪算法.md
│ │ ├── 5.3~多边形裁剪算法.md
│ │ ├── 5.4~文本裁剪算法.md
│ │ └── 5.5~二维图形的输出流程.md
│ ├── 09~OpenGL 设计基础
│ │ ├── 9.1~概述.md
│ │ └── 9.2~OpenGL 应用程序的工作过程.md
│ └── 10~VRML 环境下图形系统的设计
│ │ └── 10.1~虚拟现实简介.md
├── z文聿~计算几何笔记
│ └── README.md
├── 2020~《Scratchapixel》
│ └── README.md
├── 2020~计算机图形学学习笔记
│ ├── README.md
│ └── 01~绪论.md
├── 2011~《3D Math Primer for Graphics and Game Development》
│ └── README.md
├── 2008~Mark~《Computational Geometry: Algorithms and Applications》
│ ├── codes
│ │ ├── 2010~java-codes
│ │ │ ├── README.md
│ │ │ ├── .gitignore
│ │ │ ├── Computational_Geometry_Orientation.ipynb
│ │ │ └── Computational_Geometry_Check_left_right.ipynb
│ │ └── 2018~python-codes
│ │ │ ├── README.md
│ │ │ ├── .gitignore
│ │ │ ├── Computational_Geometry_Orientation.ipynb
│ │ │ └── Computational_Geometry_Check_left_right.ipynb
│ ├── README.md
│ ├── 2023~V4
│ │ ├── 15~Big Geometric Data (大规模几何数据处理)
│ │ │ └── 15.02~近似算法 (Approximate Algorithms).md
│ │ └── README.md
│ ├── 2008~V3
│ │ └── README.md
│ └── Cursor 摘要
│ │ └── 01~计算几何基础.md
├── 1998~《Real-Time Rendering》
│ ├── README.md
│ └── 2018~《实时渲染(Real-Time Rendering)》~V4
│ │ └── Chapter 24 The Future 未来.md
└── 2001~Marschner~《Fundamentals of Computer Graphics》
│ └── README.md
├── .DS_Store
├── .gitignore
├── README.md
├── index.html
└── header.svg
/.nojekyll:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/00~图形学基础/00~计算几何/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/03~图形绘制库/Vulkan/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/INTRODUCTION.md:
--------------------------------------------------------------------------------
1 | # 本篇导读
2 |
--------------------------------------------------------------------------------
/00~图形学基础/README.md:
--------------------------------------------------------------------------------
1 | # 计算几何
2 |
--------------------------------------------------------------------------------
/01~真实感渲染/03~渲染管线/README.md:
--------------------------------------------------------------------------------
1 | # 渲染管线
2 |
--------------------------------------------------------------------------------
/01~真实感渲染/00~概述/发展历史.md:
--------------------------------------------------------------------------------
1 | # 计算机图形学发展历史
2 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/README.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/04~二维图形变换/4.1~数学基础.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/04~二维图形变换/4.2~基本变换.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/04~二维图形变换/4.3~组合变换.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/06~三维图形学基础/6.3~裁剪.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/07~三维物体的表示/7.2~二次曲面.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/08~真实感图显技术/8.1~颜色模型.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/08~真实感图显技术/8.2~光照模型.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/08~真实感图显技术/8.4~纹理映射.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/08~真实感图显技术/8.5~透明性.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/01~绪论/1.1~计算机图形学的研究内容.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/02~二维图形生成技术/2.1~直线的生成.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/02~二维图形生成技术/2.2~圆的生成.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/02~二维图形生成技术/2.3~椭圆的生成.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/02~二维图形生成技术/2.4~曲面与曲线.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/02~二维图形生成技术/2.5~输出图元的属性.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/02~二维图形生成技术/2.6~字符的生成.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/03~二维实面积图形的生成/3.1~矩形填充.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/03~二维实面积图形的生成/3.2~区域填充.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/03~二维实面积图形的生成/3.3~图案填充.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/05~二维图形的裁剪/5.1~图形的开窗.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/05~二维图形的裁剪/5.2~线段裁剪算法.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/05~二维图形的裁剪/5.3~多边形裁剪算法.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/05~二维图形的裁剪/5.4~文本裁剪算法.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/05~二维图形的裁剪/5.5~二维图形的输出流程.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/06~三维图形学基础/6.1~三维图形的几何变换.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/06~三维图形学基础/6.2~三维图形的投影.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/06~三维图形学基础/6.4~三维图形的输出流程.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/08~真实感图显技术/8.3~阴影的生成.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/08~真实感图显技术/8.6~隐藏线的消除.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/08~真实感图显技术/8.6~隐藏面的消除.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/09~OpenGL 设计基础/9.1~概述.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/07~三维物体的表示/7.1~平面物体的表示.md:
--------------------------------------------------------------------------------
1 | # 平面物体的表示
2 |
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/09~OpenGL 设计基础/9.2~OpenGL 应用程序的工作过程.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wx-chevalier/CG-Notes/master/.DS_Store
--------------------------------------------------------------------------------
/99~参考资料/2023~孔令德~《计算机图形学(微课版)》/10~VRML 环境下图形系统的设计/10.1~虚拟现实简介.md:
--------------------------------------------------------------------------------
1 | # 虚拟现实简介
2 |
--------------------------------------------------------------------------------
/03~图形绘制库/Web 图形绘制/WebGL/README.link:
--------------------------------------------------------------------------------
1 | https://github.com/wx-chevalier/Three.js-Notes
--------------------------------------------------------------------------------
/03~图形绘制库/Web 图形绘制/WebGPU/README.link:
--------------------------------------------------------------------------------
1 | https://github.com/wx-chevalier/Three.js-Notes
--------------------------------------------------------------------------------
/99~参考资料/z文聿~计算几何笔记/README.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://zhuanlan.zhihu.com/p/33355636)
2 |
--------------------------------------------------------------------------------
/03~图形绘制库/Web 图形绘制/Three.js/README.link:
--------------------------------------------------------------------------------
1 | https://github.com/wx-chevalier/Three.js-Notes
--------------------------------------------------------------------------------
/01~真实感渲染/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wx-chevalier/CG-Notes/master/01~真实感渲染/.DS_Store
--------------------------------------------------------------------------------
/03~图形绘制库/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wx-chevalier/CG-Notes/master/03~图形绘制库/.DS_Store
--------------------------------------------------------------------------------
/01~真实感渲染/04~光线追踪/BVH/99~参考资料/2020~BVH 树的构建.md:
--------------------------------------------------------------------------------
1 | # Links
2 |
3 | - BVH 树的构建 https://zhuanlan.zhihu.com/p/114307697
4 |
--------------------------------------------------------------------------------
/99~参考资料/2020~《Scratchapixel》/README.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://www.scratchapixel.com/index.html#)
2 |
3 | # Scratchapixel
4 |
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/99~参考资料/2023-视图变换(投影变换,视口变换).md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://zhuanlan.zhihu.com/p/597152918)
2 |
3 | # 视图变换(投影变换,视口变换)
4 |
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/齐次坐标/99~参考资料/2020~齐次坐标与投影几何.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://www.cnblogs.com/z-y-k/p/16120255.html)
2 |
3 | # 齐次坐标与投影几何
4 |
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/齐次坐标/99~参考资料/2017~齐次坐标入门级思考.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://oncemore2020.github.io/blog/homogeneous/)
2 |
3 | # 齐次坐标系入门级思考
4 |
--------------------------------------------------------------------------------
/03~图形绘制库/Web 图形绘制/Three.js/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wx-chevalier/CG-Notes/master/03~图形绘制库/Web 图形绘制/Three.js/.DS_Store
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/README.md:
--------------------------------------------------------------------------------
1 | # GAMES101 课程笔记
2 |
3 | # Links
4 |
5 | - https://zhuanlan.zhihu.com/p/183192544
6 |
--------------------------------------------------------------------------------
/03~图形绘制库/OpenGL/99~参考资料/《Learn OpenGL》笔记/README.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://github.com/LearnOpenGL-CN/LearnOpenGL-CN)
2 |
3 | # Learn OpenGL 笔记
4 |
--------------------------------------------------------------------------------
/99~参考资料/2020~计算机图形学学习笔记/README.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://zhangt.top/CS/Computer-Graphics-Study-Notes/#%E7%AC%AC1%E7%AB%A0-%E7%BB%AA%E8%AE%BA)
2 |
--------------------------------------------------------------------------------
/01~真实感渲染/03~渲染管线/99~参考资料/2021~细说图形学渲染管线.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wx-chevalier/CG-Notes/master/01~真实感渲染/03~渲染管线/99~参考资料/2021~细说图形学渲染管线.pdf
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/仿射变换/二维仿射变换/99~参考资料/2020-一文搞懂仿射变换.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://blog.csdn.net/sinat_29957455/article/details/103845581)
2 |
3 | # 一文搞懂仿射变换
4 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/隐式表面/SDF/README.md:
--------------------------------------------------------------------------------
1 | # SDF
2 |
3 | # Links
4 |
5 | - https://blog.csdn.net/qq_41368247/article/details/106194092: 2D 基本图形的 Sign Distance Function (SDF) 详解。
6 |
--------------------------------------------------------------------------------
/99~参考资料/2011~《3D Math Primer for Graphics and Game Development》/README.md:
--------------------------------------------------------------------------------
1 | ```md
2 | 原文地址:https://gamemath.com/
3 | ```
4 |
5 | # 3D Math Primer for Graphics and Game Development
6 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/三维对象表示/三维建模/README.md:
--------------------------------------------------------------------------------
1 | # 三维建模
2 |
3 | 3D 建模主要有 5 种方式:
4 |
5 | - 多边形建模
6 | - 雕塑建模
7 | - CAD 建模
8 | - 3D 扫描(激光扫描、摄影阵列扫描)
9 | - 程序参数化建模
10 |
11 | 
12 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/02~Review of Linear Algebra.md:
--------------------------------------------------------------------------------
1 | # Review of Linear Algebra
2 |
3 | > - [Mathematics-Notes](https://ng-tech.icu/books/Mathematics-Notes)
4 |
5 | 这节课主要回顾了一下线性代数相关的基础知识,包括向量、向量运算、矩阵、矩阵运算等等。基本在本科覆盖范围内,因此叫 Review。
6 |
--------------------------------------------------------------------------------
/03~图形绘制库/OpenGL/99~参考资料/2022~Introduction to GPUs with OpenGL.md:
--------------------------------------------------------------------------------
1 | # Introduction to GPUs with OpenGL
2 |
3 | # Links
4 |
5 | - Introduction to GPUs with OpenGL https://engineering.monstar-lab.com/en/post/2022/03/01/Introduction-To-GPUs-With-OpenGL/
6 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2010~java-codes/README.md:
--------------------------------------------------------------------------------
1 | # Computational_Geometry
2 | Python implementation of some of the algorithms in the "Computational Geometry: Algorithms and Applications" book.
3 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2018~python-codes/README.md:
--------------------------------------------------------------------------------
1 | # Computational_Geometry
2 | Python implementation of some of the algorithms in the "Computational Geometry: Algorithms and Applications" book.
3 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2024~《Implementing a tiny CPU rasterizer》/README.md:
--------------------------------------------------------------------------------
1 | > DocId:LFWbBtZQlqUeoc9y
2 |
3 | ```
4 | 原文链接:https://lisyarus.github.io/blog/posts/implementing-a-tiny-cpu-rasterizer-part-1.html
5 | ```
6 |
7 | # Implementing a tiny CPU rasterizer
8 |
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/投影变换/README.md:
--------------------------------------------------------------------------------
1 | # 投影变换
2 |
3 | 把三维物体变为二维图形表示的过程称为形体的投影变换。根据投影中心与投影平面之间距离的不同,投影可分为平行投影和透视投影。
4 |
5 | 
6 |
7 | 平行投影的投影中心与投影平面之间的距离为穷大,而对透视投影,该距离是有限的。
8 |
9 | 
10 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/直线.md:
--------------------------------------------------------------------------------
1 | # 直线
2 |
3 | 在数学上,理想的直线是没有宽度的,由无数个点构成的集合。我们只能在显示器所给定 的有限个像素组成的矩阵中,确定最佳逼近于该直线的一组像素,并且按扫描顺序,用当前的 写方式,对这些像素进行写操作。在光棚显示器的灾光屏上生成一个对象,实质上是往坝缓冲寄存器的相应单元中填人数 据。画一条从 $\left(x_{1}, y_{1}\right)$ 到 $\left(x_{2}, y_{2}\right)$ 的直线(注意 : 这里的坐标是显示器的坐标,以像素为单位,也可称为设备坐标),实质上是一个发现最佳逼近直线的像素序列,并填入色彩数据的过程。这个过程也称为直线光棚化。本节介绍在光棚显示器上直线光棚化的最常用的两种算法:直线 DDA 算法和直线 Bresenham 算法。
4 |
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/仿射变换/三维仿射变换/README.md:
--------------------------------------------------------------------------------
1 | # 三维几何变换
2 |
3 | 三维图形的基本变换有:三维比例变换、三维对称变换、三维错切变换、三维旋转变换。和二维图形一样,用适当的变换矩阵也可以对三维图形进行各种几何变换。对三维空间的点如(x,y,z),可用齐次坐标表示为(x,y,z,1)或(x,y,z,h),三维空间里的点的变换可写为:
4 |
5 | $$
6 | \left[\begin{array}{lll}
7 | x^{\prime} & y^{\prime} & z & 1
8 | \end{array}\right]=\left[\begin{array}{lll}
9 | x & y & z & 1
10 | \end{array}\right][M]
11 | $$
12 |
13 | 其中[M]是 `4*4` 阶变换矩阵,即:
14 |
15 | 
16 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/三维对象表示/三维建模/UV 展开.md:
--------------------------------------------------------------------------------
1 | # UV 展开
2 |
3 | UV 展示就是把 3D 模型展开成可以使用的平面版本,这样就可以把图案或者 Logo 应用在 3D 模型表面上。UV 展开主要有 2 种方式:
4 |
5 | - 快速投影映射
6 | - 特定(独一无二)的 UV 展开
7 |
8 | ## 快速投影映射
9 |
10 | - 适用于简单的模型,非常简单让用户无需了解 UV 展开
11 | - 映射方式:平面、矩形、圆柱、球体
12 | - 会导致 UV 大量重叠,不适合烘培贴图
13 | - 无法满足模型每个面在 UV 上都有对应的唯一位置
14 |
15 | ## 特定的 UV 展开
16 |
17 | - 支持手动布局(像拼图游戏),可以实现 UV 利用率最大化
18 | - 手动分 UV 需要掌握技巧和方法,平衡好接缝、UV 比例与扭曲变形
19 | - 自动展 UV,可以大大提升效率,但是效果无法保证,正常和手动分 UV 一起配合适用
20 |
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/仿射变换/二维仿射变换/README.md:
--------------------------------------------------------------------------------
1 | # 二维仿射变换
2 |
3 | 图形的几何变换一般是指图形的几何信息经过变换后产生新的图形,图形几何变换既可以看作是坐标系不动而图形变动,即变动后的图形在坐标系中的坐标值发生变化;又可以看作是图形不动而坐标系变动,即变动后的图形在新坐标系下具有新的坐标值。基本的变换有平移、旋转、缩放等。
4 |
5 | 计算机图形学中基本的二维图形的几何变换算法:
6 |
7 | $$
8 | \left[x^{\prime} y^{\prime} 1\right]=\left[\begin{array}{lll}
9 | x & y & 1
10 | \end{array}\right]\left[\begin{array}{lll}
11 | a & b & c \\
12 | d & e & f \\
13 | g & h & i
14 | \end{array}\right]=\left[\frac{a x+d f+g}{c x+f y+i} \frac{b x+e y+h}{c x+f y+j} 1\right]
15 | $$
16 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/三维对象表示/Polygonal Mesh/README.md:
--------------------------------------------------------------------------------
1 | # 3D Polygonal Mesh
2 |
3 | 
4 |
5 | 
6 |
7 | Polygonal Mesh 的常见操作为:
8 |
9 | - Analysis
10 |
11 | - Normals
12 | - Curvature
13 |
14 | - Warps
15 |
16 | - Rotate
17 | - Deform
18 |
19 | - Filters
20 | - Smooth
21 | - Sharpen
22 | - Truncate
23 | - Bevel
24 |
25 | # Links
26 |
27 | - 2010-Polygon Mesh Processing Slides
28 |
--------------------------------------------------------------------------------
/00~图形学基础/02~几何变换/README.md:
--------------------------------------------------------------------------------
1 | # 图形变换
2 |
3 | 建立了显示输入图形基元和它们的属性,有了相应的程序过程,就可以生成各种图形和图景模式。除此之外,在当前许多应用环境中,还需要改变或者处理显示图形,有时需要减少显示物体或者图形的尺寸,而把它们放在一个大的显示区中,也可以重新安排图案各部分的位置和大小,来测试设计图案的各种现象,在动画设计中,又需要让显示物体在显示器上进行连续的运动。这些各种各样的处理方法,可通过对显示物体中的各个坐标点加以适当的变换来完成。
4 |
5 | 从应用角度讲,图形变换可以分为两种:几何变换(geometrical transformation)和视像变换(viewing transformation)。几何变换是在坐标系不变的情况下,由形体的几何位置或者比例改变而引起的变换,例如图形的放缩、移动、旋转、变形等。几何变换是最通常的变换,也是图形变换的基础;视像变换也称为观察变换或取景变换,是将形体从原坐标系变换到便于观察的另一坐标系,是两个坐标系之间的变换。两种变换仅在对问题的提出和处理的角度不同,两者的数学基础和实际效果是一致的。这个问题可以这样理解,即几何变换是坐标系不动;形体相对坐标系在变化;而视像变换是形体本身不动,所处的坐标系在变换。
6 |
--------------------------------------------------------------------------------
/00~图形学基础/99~参考资料/2024~Understanding 3D Graphics.md:
--------------------------------------------------------------------------------
1 | > [The article](https://azeemba.com/posts/understanding-3d-graphics.html#uv-mapping-and-textures) on Azeemba discusses UV mapping and textures in 3D graphics. UV mapping involves taking a 2D texture and wrapping it around a 3D object by mapping each face of the object to the corresponding area in the texture. This mapping helps shaders determine which part of the texture to use for each vertex. It also explains normal maps, which add surface detail without extra geometry by encoding surface directions in the texture.
2 |
3 | # Understanding 3D Graphics
4 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/README.md:
--------------------------------------------------------------------------------
1 | # Computational Geometry: Algorithms and Applications 各版本对比
2 |
3 | ## 第一版 (1997)
4 |
5 | - 首次出版
6 | - 13 章内容
7 | - 作者: Mark de Berg, Marc van Kreveld, Mark Overmars, Otfried Schwarzkopf
8 |
9 | ## 第二版 (2000)
10 |
11 | - 更新部分算法
12 | - 13 章内容
13 | - 增加了更多练习题
14 | - 修正了第一版的一些错误
15 |
16 | ## 第三版 (2008)
17 |
18 | - 15 章内容
19 | - Otfried Schwarzkopf 改名为 Otfried Cheong
20 | - 增加了新的章节和算法
21 | - 更新了参考文献
22 | - 增加了更多实际应用案例
23 |
24 | ## 第四版 (2023)
25 |
26 | - 最新版本
27 | - 重新组织了部分内容
28 | - 更新了算法和应用
29 | - 增加了现代计算几何的新发展
30 | - 加入了更多实际工程案例
31 |
--------------------------------------------------------------------------------
/03~图形绘制库/Web 图形绘制/Canvas/图片处理.md:
--------------------------------------------------------------------------------
1 | # Canvas 中的图片处理
2 |
3 | ```js
4 | async function getCanvasFromImageUrl(imgUrl) {
5 | const img = new Image();
6 | img.crossOrigin = "Anonymous";
7 | img.src = imgUrl;
8 |
9 | return new Promise((resolve, reject) => {
10 | img.onload = () => {
11 | const canvas = document.createElement("canvas");
12 | canvas.width = img.width;
13 | canvas.height = img.height;
14 | const ctx = canvas.getContext("2d");
15 | ctx.drawImage(img, 0, 0);
16 | resolve(canvas);
17 | };
18 |
19 | img.onerror = err => {
20 | reject(err);
21 | };
22 | });
23 | }
24 | ```
25 |
--------------------------------------------------------------------------------
/03~图形绘制库/README.md:
--------------------------------------------------------------------------------
1 | # 二维绘图
2 |
3 | - Coordinates
4 | - 2D Linear Transform
5 | - scale
6 | - translate
7 | - rotation
8 | - skew
9 | - Matrix Representation
10 | - `x' = T x`
11 | - composable
12 | - Vector
13 | - Line
14 | - Color
15 | - Width
16 | - LineCap
17 | - Multiline: Triangle / Rect / Polygon
18 | - Path
19 | - LineJoin
20 | - Circle, Ellipse
21 | - Text
22 | - Font
23 | - Glyph
24 | - Weight (often in pound / pt)
25 | - Baseline
26 | - Drawing API - high level
27 | - Browser: `HTMLCanvasElement`
28 | - Android: `Canvas`
29 | - iOS: `CGContext`
30 | - Drawing API - low level
31 | - OpenGL / OpenGL ES
32 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/三维对象表示/三维模型格式/README.md:
--------------------------------------------------------------------------------
1 | # Three.js 中的模型导出与加载
2 |
3 | - JSON:Three.js 有它自己的 JSON 文件格式,你可以用它以声明的方式定义几何体和场景。但它并不是一种正式的格式。它很容易使用,当你要复用复杂的几何体或场景时非常有用
4 |
5 | - OBJ 是一种简单的三维文件格式,由 Wavefront 科技公司创立。它是使用最广泛的三维文 OBJ 和 MTL 件格式,用来定义对象的几何体。ML 文件常同 OBJ 文件一起使用,在一个 MTL 文件中,对象的材质定义在 OBJ 文件中
6 |
7 | - Collad:Collada 是一种用来定义 XML 类文件中数字内容的格式。这也是一种被广泛使用的格式,差不多所有的三维软件和渲染引擎都支持这种格式。
8 |
9 | - STL:STL 是 STereoLithography(立体成型术)的缩写,广泛用于快速成型。例如三维打印机的模型文件通常都是 STL 文件。
10 |
11 | - CTM:CTM 是由 openCTM 创建的文件格式。可以用来压缩存储表示三维网格的三角形面片。
12 |
13 | - VTK:VTK 是由 Visualization Toolkit 定义的文件格式,用来指定顶点和面。VTK 有两种格式,Three. js 支持旧的,即 ASC 格式。
14 |
15 | - PDB:这是一种非常特别的格式,由 Protein Databank(蛋白质数据银行)创建,用来定义蛋白质的形状。Three. js 可以加载并显示用这种格式描述的蛋白质。
16 |
17 | - PLY:该格式全称是多边形(polygon)文件格式,通常用来保存三维扫描仪的数据。
18 |
--------------------------------------------------------------------------------
/01~真实感渲染/README.md:
--------------------------------------------------------------------------------
1 | # 计算机图形学
2 |
3 | 关于计算机图形学的定义众说纷纭。IEEE 对计算机图形学的定义为:Computer graphics is the art or science of producing graphical images with the aid of computer。国际标准化组织 ISO 将计算机图形学定义为:计算机图形学是一门研究通过计算机将数据转换成图形,并在专门显示设备上显示的原理方法和技术的学科。它是建立在传统的图学理论、应用数学及计算机科学基础上的一门边缘学科。总而言之,计算机图形学是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
4 |
5 | 计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。虽然通常认为 CG 是指三维图形的处理,事实上也包括了二维图形及图像的处理。狭义地理解,计算机图形学是数字图象处理或计算机视觉的逆过程:计算机图形学是用计算机来画图像的学科,数字图象处理是把外界获得的图象用计算机进行处理的学科,计算机视觉是根据获取的图像来理解和识别其中的物体的三维信息及其他信息。不过,这些都是不确切的定义,实际上,计算机图形学、数字图象处理和计算机视觉在很多地方的区别不是非常清晰,很多概念是相通的,而且随着研究的深入,这些学科方向不断的交叉融入,形成一个更大的学科方向,可称之为“可视计算”(Visual Computing)。
6 |
7 | # CG VS CV
8 |
9 | 
10 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/三维对象表示/体素.md:
--------------------------------------------------------------------------------
1 | # 体素(Voxel)
2 |
3 | 
4 |
5 | 上图中是 3D 数据的不同表示类型:(a)点云(Point clouds);(b) 体素网格(Voxel grids);(c) 多边形网格(Polygon meshes);(d) 多视图表示(Multi-view representations),其中:
6 |
7 | a. 点云是三维空间(xyz 坐标)点的集合。
8 | b. 体素是 3D 空间的像素。量化的,大小固定的点云。每个单元都是固定大小和离散坐标。
9 | c. Mesh 是面片的集合。
10 | d. 多视图表示是从不同模拟视点渲染的 2D 图像集合。
11 |
12 | # 体素网格(Voxel Grid)
13 |
14 | 为了解释体素网格(Voxel Grid),首先我们要了解占据栅格地图(Occupancy Grid Map):
15 |
16 | 
17 |
18 | 画一个二维网格,每个网格单元里有实体的话就为占据状态(1),空的话就为(0)。很好理解。而体素就是固定分辨率的三维栅格地图。
19 |
20 | 
21 |
22 | 体素网格是固定分辨率的,与之对应可变分辨率的网格叫八叉树地图(Octomap)。
23 |
24 | 
25 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/01~Overview of Computer Graphics.md:
--------------------------------------------------------------------------------
1 | # Overview of Computer Graphics
2 |
3 | 对课程内容进行大致介绍,同时对图形学进行介绍。
4 |
5 | 
6 |
7 | 
8 |
9 | 
10 |
11 | 介绍一下图形学是什么,以及为什么学图形学;之后介绍了课程包含的四大内容:
12 |
13 | 
14 |
15 | 
16 |
17 | 
18 |
19 | 
20 |
--------------------------------------------------------------------------------
/01~真实感渲染/03~渲染管线/顶点变换/99~参考资料/2021~三维相机入门.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://zhuanlan.zhihu.com/p/377692010) TODO!
2 |
3 | # **前言**
4 |
5 | 相信大家在入门渲染的时候都写过这样的 demo,将准备好的顶点数据上传至 GPU 进行绘制,就像用笔触在固定画布上面绘制图形。这套没有经过封装的流程对于 2D 引擎来说已经够用,但在 3D 引擎中想要展现逼真的效果还需要实现与现实相机相仿的功能,本文会重点讲述三维相机的渲染流程,阅读后你将会 get:
6 |
7 | - 相机如何确定三维空间的渲染内容。
8 | - 关于变换的一些基本的几何知识。
9 | - 如何在代码中表示线性变换。
10 | - 三维空间转换至显示设备的流程与推导。
11 |
12 | 另外本文有几点需要注意的概念:
13 |
14 | - 本文使用的坐标系皆为右手坐标系。
15 | - 本文涉及的所有变换皆可用线性矩阵表示,如下图所示:
16 |
17 | 
18 |
19 | - 标准化设备坐标(Normalized Device Coordinates),是设备所能理解的坐标系,本文特指 webgl 中 XYZ 范围皆在 -1 到 1 的坐标空间。
20 | - 本文默认相机的上方向为正 Y 轴,且向负 Z 轴观察。
21 |
22 | # **2、概述**
23 |
24 | 大部分渲染引擎中的相机的作用是,将任一瞬间经由相机可以看见的世界,转换成设备可以理解的数据,最后显示到屏幕上,可以将此过程简单描述如下:
25 |
26 | 
27 |
28 | 由上图可知,若要渲染一个小鸭模型我们需要实现以下步骤:
29 |
30 | 1. 将模型放置在相机的可视范围内
31 | 2. 将模型上顶点的局部坐标转换为世界坐标(**模型变换**)
32 | 3. 将模型上顶点的世界坐标转换为视图坐标(**视图变换**)
33 | 4. 顶点的视图坐标经过投影变换为裁剪坐标,然后对顶点做透视除法获取规范化设备坐标系中的坐标。(**投影变换**)
34 |
--------------------------------------------------------------------------------
/99~参考资料/1998~《Real-Time Rendering》/README.md:
--------------------------------------------------------------------------------
1 | # Real-Time Rendering
2 |
3 | 这个系列的书籍是《Real-Time Rendering》(实时渲染),是计算机图形学领域,特别是实时渲染技术方面的一部重要著作。以下是对这个系列的简要介绍:
4 |
5 | 1. 概述
6 | 《Real-Time Rendering》系列致力于全面介绍实时计算机图形学的理论和实践。它涵盖了从基础概念到最新技术的广泛内容,是学习和研究实时渲染的重要参考资料。
7 |
8 | 2. 作者
9 |
10 | - Tomas Akenine-Möller:所有版本的主要作者之一
11 | - Eric Haines:所有版本的主要作者之一
12 | - Naty Hoffman:从第三版开始加入的合著者
13 |
14 | 3. 版本历史
15 |
16 | - 第一版:1998 年
17 | - 第二版:2002 年
18 | - 第三版:2008 年
19 | - 第四版:2018 年
20 |
21 | 4. 内容范围
22 | 这个系列涵盖了实时渲染的各个方面,包括但不限于:
23 |
24 | - 图形管线和 GPU 架构
25 | - 几何数学和变换
26 | - 光照和着色模型
27 | - 纹理映射
28 | - 阴影技术
29 | - 全局光照近似
30 | - 图像空间技术
31 | - 非真实感渲染
32 | - 动画和模拟
33 | - 优化技术
34 |
35 | 5. 特点
36 |
37 | - 全面性:涵盖了实时渲染的几乎所有重要方面
38 | - 与时俱进:每个新版本都会更新最新的图形技术和算法
39 | - 理论与实践结合:不仅解释理论,还提供实际应用的见解
40 | - 丰富的插图和参考:使用大量图表和代码示例来解释复杂概念
41 |
42 | 6. 目标读者
43 |
44 | - 计算机图形学学生和研究人员
45 | - 游戏开发者
46 | - 图形引擎开发者
47 | - 虚拟现实和增强现实开发者
48 | - 对实时渲染感兴趣的专业人士
49 |
50 | 7. 影响
51 | 这个系列已成为实时渲染领域的标准教材和参考书,在学术界和工业界都有广泛的影响力。它不仅帮助读者理解现有技术,还激发了新技术的开发和创新。
52 |
53 | 总的来说,《Real-Time Rendering》系列是一套深入而全面的实时渲染参考书,它随着计算机图形学技术的发展而不断更新,为读者提供了解和掌握这一快速发展领域的宝贵资源。
54 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/三维对象表示/README.md:
--------------------------------------------------------------------------------
1 | # 三维对象表示
2 |
3 | 三维对象表示包括多种方法,每种方法都有其特定的优势和应用场景。以下是主要的三维对象表示方法:
4 |
5 | 1. 点基表示:
6 |
7 | - 点云(Point Clouds)
8 | - 深度图像(Range Images)
9 |
10 | 2. 体积表示:
11 |
12 | - 体素(Voxels)
13 | - 八叉树(Octrees)
14 | - 二叉空间分割树(BSP Trees)
15 | - 构造实体几何(Constructive Solid Geometry, CSG)
16 | - 扫描表示(Sweep Representations)
17 |
18 | 3. 表面表示:
19 |
20 | - 多边形网格(Polygonal Meshes)
21 | - 三角网格
22 | - 四边形网格
23 | - 细分曲面(Subdivision Surfaces)
24 | - 参数化曲面(Parametric Surfaces)
25 | - NURBS(Non-Uniform Rational B-Splines)
26 | - Bézier 曲面
27 | - 隐式表面(Implicit Surfaces)
28 | - 距离场(Distance Fields)
29 | - 符号距离函数(Signed Distance Functions, SDF)
30 |
31 | 4. 边界表示(Boundary Representations, B-Rep)
32 |
33 | 5. 骨架表示:
34 |
35 | - 中轴(Medial Axis)
36 | - 骨架图(Skeleton Graphs)
37 |
38 | 6. 高级结构:
39 |
40 | - 场景图(Scene Graphs)
41 | - 层次细节(Level of Detail, LOD)模型
42 |
43 | 7. 程序化几何(Procedural Geometry)
44 |
45 | 8. 神经隐式表示(Neural Implicit Representations)
46 |
47 | 9. 混合表示:
48 | - 结合多种表示方法的混合模型
49 |
50 | 每种方法都有其特定的用途和优势:
51 |
52 | - 点云适合表示从 3D 扫描获得的原始数据。
53 | - 体素适合体积渲染和某些物理模拟。
54 | - 多边形网格是实时渲染的常用选择。
55 | - 参数化曲面在 CAD/CAM 中广泛使用。
56 | - 隐式表面适合表示光滑形状和进行布尔运算。
57 |
58 | 选择合适的表示方法取决于具体的应用需求,如精度要求、渲染效率、编辑灵活性、存储效率等因素。在实际应用中,有时会结合使用多种表示方法以充分利用各自的优势。
59 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore all
2 | *
3 |
4 | # Unignore all with extensions
5 | !*.*
6 |
7 | # Unignore all dirs
8 | !*/
9 |
10 | .DS_Store
11 |
12 | # Logs
13 | logs
14 | *.log
15 | npm-debug.log*
16 | yarn-debug.log*
17 | yarn-error.log*
18 |
19 | # Runtime data
20 | pids
21 | *.pid
22 | *.seed
23 | *.pid.lock
24 |
25 | # Directory for instrumented libs generated by jscoverage/JSCover
26 | lib-cov
27 |
28 | # Coverage directory used by tools like istanbul
29 | coverage
30 |
31 | # nyc test coverage
32 | .nyc_output
33 |
34 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
35 | .grunt
36 |
37 | # Bower dependency directory (https://bower.io/)
38 | bower_components
39 |
40 | # node-waf configuration
41 | .lock-wscript
42 |
43 | # Compiled binary addons (https://nodejs.org/api/addons.html)
44 | build/Release
45 |
46 | # Dependency directories
47 | node_modules/
48 | jspm_packages/
49 |
50 | # TypeScript v1 declaration files
51 | typings/
52 |
53 | # Optional npm cache directory
54 | .npm
55 |
56 | # Optional eslint cache
57 | .eslintcache
58 |
59 | # Optional REPL history
60 | .node_repl_history
61 |
62 | # Output of 'npm pack'
63 | *.tgz
64 |
65 | # Yarn Integrity file
66 | .yarn-integrity
67 |
68 | # dotenv environment variables file
69 | .env
70 |
71 | # next.js build output
72 | .next
73 |
--------------------------------------------------------------------------------
/01~真实感渲染/03~渲染管线/顶点变换/99~参考资料/2021~渲染管线中的顶点变换.md:
--------------------------------------------------------------------------------
1 | > [原文地址](https://zhuanlan.zhihu.com/p/127301402) TODO!
2 |
3 | # 渲染管线中的顶点变换
4 |
5 | ## 概述
6 |
7 | 在图形学渲染管线中,一个顶点坐标,大概要经历局部坐标系、世界坐标系、相机坐标系、裁剪坐标系,最后到窗口坐标系,显示在屏幕上。
8 |
9 | 
10 |
11 | 在这些过程中,从一个坐标系到另一个坐标系,都需要进行一定的变换。下面,将介绍每次变换的方式。
12 |
13 | ## 局部空间->世界空间
14 |
15 | 这一变换过程,主要是将模型放置在世界空间中,进行一定的缩放、旋转或平移。这一步比较简单,只要将相应的矩阵作用到模型的局部空间坐标即可。
16 |
17 | 比如,对模型缩放 $(S_x, S_y, S_z)$ ,然后绕 Z 轴旋转 $\theta$ 度,再进行 $(T_x,T_y,T_z)$ 的平移。注意,这里的变换顺序是不能变的,即要先进行缩放,再进行旋转,最后进行平移。据此,我们可以构建模型变换矩阵。
18 |
19 | $$
20 | M_{\text {model }}=\left[\begin{array}{cccc}
21 | 1 & 0 & 0 & T_x \\
22 | 0 & 1 & 0 & T_y \\
23 | 0 & 0 & 1 & T_z \\
24 | 0 & 0 & 0 & 1
25 | \end{array}\right]\left[\begin{array}{cccc}
26 | \cos \theta & -\sin \theta & 0 & 0 \\
27 | \sin \theta & \cos \theta & 0 & 0 \\
28 | 0 & 0 & 1 & 0 \\
29 | 0 & 0 & 0 & 1
30 | \end{array}\right]\left[\begin{array}{cccc}
31 | S_x & 0 & 0 & 0 \\
32 | 0 & S_y & 0 & 0 \\
33 | 0 & 0 & S_z & 0 \\
34 | 0 & 0 & 0 & 1
35 | \end{array}\right]
36 | $$
37 |
38 | ## 世界空间->相机空间
39 |
40 | 首先定义一下相机:
41 |
42 | - 坐标为 $\vec{e}$
43 | - 观察方向
44 | - 向上方向
45 |
46 | 
47 |
48 | 
49 |
--------------------------------------------------------------------------------
/03~图形绘制库/OpenGL/README.md:
--------------------------------------------------------------------------------
1 | # OpenGL
2 |
3 | OpenGL 定义了一个跨编程语言、平台的编程接口的规范,一般用于三维图形,但也可用于二维图像。OpenGL 是一个功能强大,调用方便的底层图形库,它与硬件无关可以在不同的平台如 windows、mac、linux 等之间进行移植,支持 OpenGL 的软件具有很好的移植性,可以获得非常广泛的支持。OpenGL 不提供几何实体格式,不能直接用于描述场景。但是,通过一些转换程序,可以很方便的将 AutoCAD、3ds MAX 等 3D 设计软件制作的 DXF 和 3DS 模型文件转换成 OpenGL 的顶点数组。
4 |
5 | OpenGL 可以与 Visual C++紧密结合,以实现有关计算和图形算法。OpenGL 使用便捷、效率高,可以实现建模、变换、映射(光照、材质、纹理)等功能。此外,OpenGL 还能实现运动模糊等特殊效果,并支持消隐算法。
6 |
7 | ## OpenGL、OpenGL ES、WebGL
8 |
9 | 我们介绍了 OpenGL,知道了它是用于计算机图形绘制的编程接口标准,支持不同平台上的图形绘制,在计算机上发挥了重要作用。后来,随着手机等移动设备性能的快速提高,人们已经不满足于将移动设备的应用止于通讯应用、记事等传统平面应用。而越来越注重移动设备功能的多样化、娱乐化,手机 3D 游戏、GPS 导航系统等代表了未来移动设备发展的方向。基于这种情况,Khronos 组织于 2003 年 7 月发布了专门针对于嵌入式设备图形开发的标准 OpenGL ES(OpenGL for Embedded Systems)。
10 |
11 | WebGL,是一项用来在网页上绘制和渲染复杂三维图形(3D 图形),并允许用户与之交互的技术。随着个人计算机和浏览器的性能越来越强,我们能够在 Web 上创建越来越精美、越来越复杂的 3D 图形。从传统意义上来说,为了显示三维图形,开发者需要使用 C 或 C++语言,辅以专门的计算机图形库,如 OpenGL 或 Direct3D,来开发一个独立的应用程序。现在有了 WebGL,我们只需要向已经熟悉的 HTML 和 JS 中添加一些额外的三维图形学的代码,就可以在网页上显示三维图形了。WebGL 是内嵌在浏览器中的,不必安装插件和库就可以直接使用它。
12 |
13 | OpenGL ES 可以说是 OpenGL 为了满足嵌入式设备需求而开发一个特殊版本,是其一个子集;而 WebGL,是为了网页渲染效果,将 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑定得到。基本关系如下图所示:
14 |
15 | 
16 |
17 | 在实际应用过程中,前端的 WebGL 是通过 JS 语句,操作本地的 OpenGL 的部分接口,对于移动设备这是操作 OpenGL ES 的接口,来实现页面的图形的渲染,WebGL 只是绑定外面接口的一层,内部的一些核心内容,如着色器,材质,灯光等都是需要借助 GLSL ES 语法来操作的。
18 |
19 | 
20 |
--------------------------------------------------------------------------------
/03~图形绘制库/Web 图形绘制/Canvas/README.md:
--------------------------------------------------------------------------------
1 | # Canvas & WebGL
2 |
3 | SVG 只是一种矢量图形文件格式,不仅现在的浏览器都支持,很多主流的系统也都支持。可以代替一些图片,多用于图标,以及图表上,优势在于拥有 HTML 的 event 事件,交互起来很方便。
4 |
5 | Canvas 是 HTML5 新增的一个元素对象,名副其实就是一个画布,浏览器 js 配有相应的操作 api,可以不再依赖其他的 API 或组件而直接绘图,相当于 2D 的 API。一般用于绘制比较复杂的动画,做游戏之类的,由于 canvas 是 HTML5 带的,所以不支持低版本浏览器,特别是 IE,canvas 只是一个画布,绘制上去的东西,例如图片,都是转换成像素点绘制上去的,所以没有 event 事件,如果需要添加交互事件,需要自己手动计算绘制的对象所在坐标以及层级。
6 |
7 | WebGL 是以 OpenGL ES 2.0 为基础的一套浏览器 3D 图形 API(HTML5),在编程概念上与 OpenGL ES 2.0 几乎是完全通用的,同样采用可编程渲染管线,也就是每个顶点的处理受到一小段 Vertex Shader 代码的控制,每个像素的绘制过程也受到一小段 Fragment Shader 代码的控制。WebGL 主要是 3D 为主,不过 2D 的绘图要求也可以变通来实现。
8 |
9 | WebGL 无论如何都需要一个显示对象来呈现,这个对象就是 Canvas,仅此而已,WebGL 不对 Canvas 有任何附加的操作 API,那部分属于浏览器 js 支持的范畴。可看作能在浏览器上运行的 OpenGL,WebGL 的 HTML 节点名称用的也是 Canvas,但是他的渲染则和 canvas 不同,他可以支持硬件加速,支持 3D,可用于 3D 游戏的开发,目前很少有 3D 的 HTML5 游戏,现在你能看到很多酷炫的图形交互的 3D 图表,大多用 WebGL 来渲染的。WebGL 也继承 OpenGL ES 2.0 的兼容性支持能力,在不同的设备上做有限的支持,需要运行时查询。
10 |
11 | Three.js、Babylon.js、Blender4Web 等是几种知名的 WebGL 开发框架,对 WebGL 基础操作做了大量的封装,可以拿来就用,即使不了解 WebGL 规范的细节。
12 |
13 | # Canvas
14 |
15 | Canvas(翻译为画布)是 HTML5 的一个标签,Canvas 可以使用 JavaScript 在网页上绘制图像,例如下面的代码就使用 Canvas 绘制一个简单的矩形。
16 |
17 | ```html
18 |
19 | ```
20 |
21 | ```js
22 | const canvas = document.getElementById("container");
23 | const context = canvas.getContext("2d");
24 | context.fillStyle = "rgba(0, 0, 255, 1.0)";
25 | context.fillRect(120, 10, 150, 150);
26 | ```
27 |
28 | Canvas 只支持一些简单的 2d 绘制,不支持 3d,更重要的是性能有限,WebGL 弥补了这两方便的不足。
29 |
--------------------------------------------------------------------------------
/00~图形学基础/01~几何表示方法/README.md:
--------------------------------------------------------------------------------
1 | # 几何表示方法
2 |
3 | 几何表示方法是计算机图形学和几何处理中的基础概念。以下是一些常见的几何表示方法:
4 |
5 | 1. 多边形网格(Polygon Meshes):
6 |
7 | - 三角网格(最常用)
8 | - 四边形网格
9 | - 混合网格
10 |
11 | 2. 点云(Point Clouds):
12 |
13 | - 无序点集
14 | - 结构化点云
15 |
16 | 3. 参数化曲面(Parametric Surfaces):
17 |
18 | - NURBS(非均匀有理 B 样条)
19 | - Bézier 曲面
20 | - B 样条曲面
21 |
22 | 4. 隐式表面(Implicit Surfaces):
23 |
24 | - 代数表面
25 | - 水平集(Level Sets)
26 | - 距离场(Distance Fields)
27 |
28 | 5. 体积表示(Volumetric Representations):
29 |
30 | - 体素网格(Voxel Grids)
31 | - 八叉树(Octrees)
32 | - 自适应距离场(Adaptive Distance Fields)
33 |
34 | 6. 细分曲面(Subdivision Surfaces):
35 |
36 | - Catmull-Clark 细分
37 | - Loop 细分
38 | - Doo-Sabin 细分
39 |
40 | 7. 骨架表示(Skeletal Representations):
41 |
42 | - 中轴(Medial Axis)
43 | - 骨架图(Skeleton Graphs)
44 |
45 | 8. 边界表示(Boundary Representations, B-Rep):
46 |
47 | - 结合了拓扑和几何信息
48 |
49 | 9. 构造实体几何(Constructive Solid Geometry, CSG):
50 |
51 | - 使用布尔运算组合基本形状
52 |
53 | 10. 扫描表示(Sweep Representations):
54 |
55 | - 旋转扫描
56 | - 平移扫描
57 |
58 | 11. 程序化几何(Procedural Geometry):
59 |
60 | - 基于规则或算法生成的几何
61 |
62 | 12. 神经隐式表示(Neural Implicit Representations):
63 |
64 | - 使用神经网络编码几何信息
65 |
66 | 13. 点基表示(Point-Based Representations):
67 |
68 | - 曲面元(Surfels)
69 |
70 | 14. 特征表示(Feature-Based Representations):
71 |
72 | - 基于几何特征的表示方法
73 |
74 | 15. 多分辨率表示(Multi-Resolution Representations):
75 | - 层次细节(LOD)模型
76 | - 渐进网格(Progressive Meshes)
77 |
78 | 每种表示方法都有其优缺点,适用于不同的应用场景:
79 |
80 | - 多边形网格适合实时渲染和交互式应用。
81 | - 点云常用于 3D 扫描和重建。
82 | - 参数化曲面在 CAD/CAM 中广泛使用。
83 | - 隐式表面适合表示光滑形状和进行布尔运算。
84 | - 体积表示适用于医学图像和物理模拟。
85 |
86 | 选择合适的几何表示方法取决于具体的应用需求,如精度要求、渲染效率、编辑灵活性等。在实际应用中,有时会结合使用多种表示方法以充分利用各自的优势。
87 |
--------------------------------------------------------------------------------
/99~参考资料/2001~Marschner~《Fundamentals of Computer Graphics》/README.md:
--------------------------------------------------------------------------------
1 | # Fundamentals of Computer Graphics ("虎书") 详细发展史
2 |
3 | ## 1. 第一版 (2001)
4 |
5 | ### 主要作者
6 |
7 | - Peter Shirley
8 |
9 | ### 特点
10 |
11 | - 第一次系统性介绍计算机图形学基础
12 | - 建立了基础的教学框架
13 | - 注重数学基础
14 | - 包含基础渲染算法
15 |
16 | ### 主要内容
17 |
18 | - 向量和矩阵运算
19 | - 基础变换
20 | - 光栅化
21 | - 基础光照模型
22 | - 简单着色算法
23 |
24 | ## 2. 第二版 (2005)
25 |
26 | ### 作者变化
27 |
28 | - Peter Shirley
29 | - Michael Ashikhmin
30 | - Steve Marschner
31 |
32 | ### 主要更新
33 |
34 | - 增加了 OpenGL 内容
35 | - 扩充了着色器编程
36 | - 更新了光线追踪部分
37 | - 加入了更多实例
38 |
39 | ### 新增内容
40 |
41 | - 可编程图形硬件
42 | - 纹理映射进阶
43 | - GPGPU 初步介绍
44 | - 曲线与曲面
45 |
46 | ## 3. 第三版 (2009)
47 |
48 | ### 作者阵容
49 |
50 | - Peter Shirley
51 | - Steve Marschner
52 | - Michael Ashikhmin
53 | - Michael Gleicher
54 |
55 | ### 重要更新
56 |
57 | - 增加了现代 GPU 架构
58 | - 更新了实时渲染技术
59 | - 扩充了全局光照部分
60 | - 加入了动画基础
61 |
62 | ### 核心改进
63 |
64 | - GLSL 着色器编程
65 | - 现代渲染管线
66 | - 物理基础渲染初步
67 | - 计算机动画基础
68 |
69 | ## 4. 第四版 (2016)
70 |
71 | ### 主要作者
72 |
73 | - Steve Marschner
74 | - Peter Shirley
75 |
76 | ### 显著变化
77 |
78 | - 重组了章节结构
79 | - 现代化了 GPU 内容
80 | - 加入了 PBR 渲染
81 | - 扩充了采样理论
82 |
83 | ### 新增重点
84 |
85 | - 物理基础渲染(PBR)
86 | - 现代 GPU 架构
87 | - 实时全局光照
88 | - 高级采样方法
89 | - 游戏引擎管线
90 |
91 | ## 5. 第五版 (2021)
92 |
93 | ### 作者
94 |
95 | - Steve Marschner
96 | - Peter Shirley
97 |
98 | ### 重大更新
99 |
100 | - 完全现代化的图形 API 介绍
101 | - 深度学习在图形学中的应用
102 | - 实时光线追踪
103 | - 现代渲染技术
104 |
105 | ### 新增章节
106 |
107 | - 神经渲染基础
108 | - 实时光线追踪
109 | - 现代 API (Vulkan/DX12)
110 | - 实时全局光照新方法
111 |
112 | ## 各版本共同特点
113 |
114 | 1. **教学特色**
115 |
116 | - 循序渐进的内容组织
117 | - 清晰的数学推导
118 | - 丰富的示例代码
119 | - 配套练习题
120 |
121 | 2. **结构特点**
122 |
123 | - 模块化的章节设计
124 | - 独立的主题单元
125 | - 渐进式的难度提升
126 | - 理论与实践结合
127 |
128 | 3. **应用导向**
129 | - 注重实际应用
130 | - 包含工程实践
131 | - 关注性能优化
132 | - 紧跟技术发展
133 |
134 | ## 影响力
135 |
136 | 1. **教育领域**
137 |
138 | - 全球顶尖大学教材
139 | - 图形学入门标准读物
140 | - 研究生推荐教材
141 | - 自学者重要参考
142 |
143 | 2. **工业界**
144 | - 工程师参考手册
145 | - 面试复习材料
146 | - 算法实现指南
147 | - 技术更新参考
148 |
149 | ## 未来展望
150 |
151 | 1. **技术趋势**
152 |
153 | - 实时光线追踪进阶
154 | - 神经渲染深入
155 | - 混合渲染技术
156 | - 元宇宙相关技术
157 |
158 | 2. **可能的发展方向**
159 | - 深度学习与图形学深度融合
160 | - 实时全局光照新方法
161 | - 跨平台图形 API 统一
162 | - 高性能渲染新范式
163 |
164 | 这本书的每个版本都紧跟计算机图形学的发展,不断更新内容以反映最新技术进展,同时保持了其作为教材的基础性和系统性,这也是它能够持续 20 年保持其重要地位的关键原因。
165 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2010~java-codes/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2018~python-codes/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/2023~V4/15~Big Geometric Data (大规模几何数据处理)/15.02~近似算法 (Approximate Algorithms).md:
--------------------------------------------------------------------------------
1 | # 近似算法 (Approximate Algorithms)
2 |
3 | 近似算法在处理大规模几何数据时特别重要,因为:
4 |
5 | 1. 精确计算可能过于耗时
6 | 2. 实际应用常常允许一定误差
7 | 3. 可以显著提高处理速度
8 | 4. 内存使用更有效率
9 |
10 | ## 1. 近似算法的基本概念
11 |
12 | 近似算法通过牺牲一定的精确度来换取更高的计算效率。在几何计算中,这种权衡尤为重要,因为:
13 |
14 | - 几何计算常常涉及大量数据点
15 | - 精确计算可能导致数值不稳定
16 | - 实际应用中通常可以容忍小误差
17 | - 计算效率对实时应用至关重要
18 |
19 | ### 1.1 近似比(Approximation Ratio)
20 |
21 | 如果算法的解决方案成本为 C,最优解成本为 C*,则近似比 ρ = C/C*。近似比越接近 1,说明算法越精确。
22 |
23 | ### 1.2 常见的近似策略
24 |
25 | - **随机采样**:从数据集中随机选择代表性样本
26 | - **网格化简化**:将空间划分为离散网格
27 | - **渐进式细化**:逐步提高精度
28 | - **贪心策略**:每步选择局部最优解
29 |
30 | ### 2.1 近似计算框架
31 |
32 | ```cpp
33 | class ApproximateComputing {
34 | public:
35 | // 近似计算配置
36 | struct ApproxConfig {
37 | double errorBound; // 误差界
38 | double confidence; // 置信度
39 | size_t sampleSize; // 采样大小
40 | bool adaptiveSampling; // 是否使用自适应采样
41 | };
42 |
43 | // 近似几何计算
44 | class GeometricApproximator {
45 | private:
46 | ApproxConfig config;
47 |
48 | // 自适应采样
49 | vector adaptiveSample(const vector& points) {
50 | vector samples;
51 |
52 | // 计算采样密度
53 | auto density = computeSamplingDensity(points);
54 |
55 | // 基于密度采样
56 | for(const auto& p : points) {
57 | if(shouldSample(p, density)) {
58 | samples.push_back(p);
59 | }
60 | }
61 |
62 | return samples;
63 | }
64 |
65 | // 误差估计
66 | double estimateError(const vector& original,
67 | const vector& approximated) {
68 | // 计算 Hausdorff 距离
69 | return computeHausdorffDistance(original, approximated);
70 | }
71 | };
72 | };
73 | ```
74 |
75 | ## 3. 误差控制与质量保证
76 |
77 | ### 3.1 误差度量
78 |
79 | 在几何近似中,常用的误差度量包括:
80 |
81 | - Hausdorff 距离:衡量两个点集之间的最大偏差
82 | - 平均误差:所有采样点的平均偏差
83 | - 拓扑误差:确保拓扑关系保持不变
84 |
85 | ### 3.2 质量保证策略
86 |
87 | - **自适应采样**:根据局部特征调整采样密度
88 | - **误差界限制**:设置可接受的最大误差范围
89 | - **置信度控制**:提供概率保证
90 |
91 | ## 4. 应用场景
92 |
93 | ### 4.1 点云处理
94 |
95 | - 大规模点云数据简化
96 | - 特征提取与匹配
97 | - 三维重建
98 |
99 | ### 4.2 计算几何
100 |
101 | - 凸包计算
102 | - 最近邻查找
103 | - Voronoi 图构建
104 |
105 | ### 4.3 图形渲染
106 |
107 | - LOD(Level of Detail)生成
108 | - 网格简化
109 | - 碰撞检测
110 |
111 | ## 5. 性能优化
112 |
113 | ### 5.1 计算优化
114 |
115 | - 并行处理
116 | - 空间索引结构
117 | - 增量计算
118 |
119 | ### 5.2 内存优化
120 |
121 | - 数据压缩
122 | - 流式处理
123 | - 缓存管理
124 |
125 | 通过合理使用近似算法,我们可以在保证计算质量的同时,显著提高处理大规模几何数据的效率。关键是要根据具体应用场景,选择合适的近似策略和参数配置。
126 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/03-04~Transformation.md:
--------------------------------------------------------------------------------
1 | # Transformation
2 |
3 | # Basic of Transformation
4 |
5 | 
6 |
7 | 首先用几个例子(摄像机在空间中的运动、机器人运动、视角变换)介绍一下为什么要用 Transformation,之后介绍几种二维上的基本变换。
8 |
9 | 
10 |
11 | 
12 |
13 | 
14 |
15 | 
16 |
17 | 
18 |
19 | 平移变换,但通常在齐次坐标下进行。合在一起成为仿射变换:
20 |
21 | 
22 |
23 | 
24 |
25 | 
26 |
27 | 
28 |
29 | 
30 |
31 | 3D 的缩放、镜像、切变基本和 2D 可直接类比。但是旋转会有一些麻烦。这是一种解决方案,将任意旋转分解为绕坐标轴旋转。并且这里需要注意坐标系,课程中使用的是右手坐标系,部分 API 和软件会使用左手坐标系。
32 |
33 | 
34 |
35 | # Camera Transformation
36 |
37 | 
38 |
39 | 
40 |
41 | 三维摄像机有 7 个维度
42 |
43 | - 位置:3 维
44 | - 朝向:3 维
45 | - 画面旋转:1 维
46 |
47 | 通常用三个向量进行对应
48 |
49 | - 位置向量
50 | - 朝向向量
51 | - 上方向量(由于一定和朝向正交,所以会冗余 2 维)
52 |
53 | 
54 |
55 | 正向考虑摄像机变换的矩阵是比较麻烦的一件事情:
56 |
57 | 
58 |
59 | 但反向考虑则比较容易,所以可以通过反向考虑,配合矩阵求逆得到结果。
60 |
61 | # Projection Transformation
62 |
63 | 投影变换本身是一个降维变换,图形学中主要针对于将三维投影至二维:
64 |
65 | 
66 |
67 | 3D 至 2D 的投影主要有两种:平行投影和透视投影:
68 |
69 | 
70 |
71 | 平行投影的操作比较简单,直接丢掉坐标中的 Z 分量即可。
72 |
73 | 
74 |
75 | 但通常需要 canonical,即首先将视图空间中心平移至原点,再缩放为标准正方体。
76 |
77 | 
78 |
79 | 整理一下可知这一系列操作对应的矩阵。
80 |
81 | 
82 |
83 | 透视投影本质上是将空间投影至一个点,但在过程中用一个平面(如胶片)截下。而对于透视变换,可以考虑将其先变换为平行,再用平行投影。
84 |
85 | 
86 |
87 | 这个矩阵并不直观,但是可以通过设立条件对矩阵进行推导
88 |
89 | - 胶片所在平面不发生变化
90 | - 而远处的平面大小缩放至和胶片一样大,且中心对齐,但 Z 值不变
91 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/2023~V4/README.md:
--------------------------------------------------------------------------------
1 | # Computational Geometry: Algorithms and Applications (Fourth Edition, 2023)
2 |
3 | ## Part I: Foundations
4 |
5 | ### Chapter 1: Computational Geometry: Introduction
6 |
7 | - 1.1 What is Computational Geometry?
8 | - 1.2 Example: Line Segment Intersection
9 | - 1.3 Single-Shot vs. Preprocessing
10 | - 1.4 Degeneracies and Robustness
11 | - 1.5 Application Domains
12 |
13 | ### Chapter 2: Line Segment Intersection
14 |
15 | - 2.1 Line Segment Properties
16 | - 2.2 The Sweep Line Algorithm
17 | - 2.3 Implementation and Analysis
18 | - 2.4 Red-Blue Line Segment Intersection
19 | - 2.5 Extensions and Applications
20 |
21 | ### Chapter 3: Polygon Triangulation
22 |
23 | - 3.1 Art Gallery Problems
24 | - 3.2 Triangulation of Simple Polygons
25 | - 3.3 Monotone Partitioning
26 | - 3.4 Triangulating Monotone Polygons
27 | - 3.5 Modern Approaches and Implementation
28 |
29 | ### Chapter 4: Linear Programming
30 |
31 | - 4.1 Geometric View of Linear Programming
32 | - 4.2 Half-plane Intersection
33 | - 4.3 Randomized Incremental Algorithm
34 | - 4.4 Higher Dimensions
35 | - 4.5 Applications in Machine Learning
36 |
37 | ## Part II: Geometric Search
38 |
39 | ### Chapter 5: Range Searching
40 |
41 | - 5.1 1D Range Searching
42 | - 5.2 Kd-Trees
43 | - 5.3 Range Trees
44 | - 5.4 Multi-level Data Structures
45 | - 5.5 Fractional Cascading
46 |
47 | ### Chapter 6: Point Location
48 |
49 | - 6.1 Point Location in a Planar Subdivision
50 | - 6.2 Trapezoidal Maps
51 | - 6.3 Randomized Incremental Algorithm
52 | - 6.4 Dynamic Point Location
53 | - 6.5 Parallel Implementations
54 |
55 | ### Chapter 7: Proximity Structures
56 |
57 | - 7.1 Voronoi Diagrams
58 | - 7.2 Fortune's Algorithm
59 | - 7.3 Delaunay Triangulations
60 | - 7.4 Nearest Neighbor Searching
61 | - 7.5 Applications in Deep Learning
62 |
63 | ## Part III: Geometric Structures
64 |
65 | ### Chapter 8: Arrangements
66 |
67 | - 8.1 Line Arrangements
68 | - 8.2 Zone Theorem
69 | - 8.3 Levels and k-Sets
70 | - 8.4 Duality
71 | - 8.5 Higher-Dimensional Arrangements
72 |
73 | ### Chapter 9: Geometric Data Structures
74 |
75 | - 9.1 Interval Trees
76 | - 9.2 Segment Trees
77 | - 9.3 BSP Trees
78 | - 9.4 R-trees and Variants
79 | - 9.5 Modern Spatial Indexes
80 |
81 | ### Chapter 10: Convex Hulls
82 |
83 | - 10.1 Properties of Convex Hulls
84 | - 10.2 2D Algorithms
85 | - 10.3 3D Convex Hulls
86 | - 10.4 Higher Dimensions
87 | - 10.5 Dynamic Maintenance
88 |
89 | ## Part IV: Applications
90 |
91 | ### Chapter 11: Robot Motion Planning
92 |
93 | - 11.1 Configuration Spaces
94 | - 11.2 Cell Decomposition
95 | - 11.3 Visibility Graphs
96 | - 11.4 Probabilistic Roadmaps
97 | - 11.5 Modern Planning Algorithms
98 |
99 | ### Chapter 12: Geometric Networks
100 |
101 | - 12.1 Spanning Trees
102 | - 12.2 Well-Separated Pair Decomposition
103 | - 12.3 Spanner Networks
104 | - 12.4 Network Design
105 | - 12.5 Geographic Networks
106 |
107 | ### Chapter 13: Mesh Generation
108 |
109 | - 13.1 Mesh Types and Quality
110 | - 13.2 Delaunay Refinement
111 | - 13.3 Guaranteed-Quality Meshing
112 | - 13.4 Surface Reconstruction
113 | - 13.5 Applications in Graphics
114 |
115 | ### Chapter 14: Shape Analysis
116 |
117 | - 14.1 Shape Similarity
118 | - 14.2 Medial Axis
119 | - 14.3 Shape Matching
120 | - 14.4 Feature Detection
121 | - 14.5 Machine Learning Applications
122 |
123 | ### Chapter 15: Big Geometric Data
124 |
125 | - 15.1 Streaming Algorithms
126 | - 15.2 Approximate Geometric Computing
127 | - 15.3 Parallel Geometric Algorithms
128 | - 15.4 Distributed Geometric Computing
129 | - 15.5 GPU Acceleration
130 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/2008~V3/README.md:
--------------------------------------------------------------------------------
1 | # Computational Geometry: Algorithms and Applications (Third Edition, 2008)
2 |
3 | ## Part I: Foundations
4 |
5 | ### Chapter 1: Computational Geometry
6 |
7 | - 1.1 An Example: Convex Hulls
8 | - 1.2 Degeneracies and Robustness
9 | - 1.3 Application Domains
10 | - 1.4 Notes and Comments
11 | - 1.5 Exercises
12 |
13 | ### Chapter 2: Line Segment Intersection
14 |
15 | - 2.1 Line Segment Intersection Detection
16 | - 2.2 The Doubly-Connected Edge List
17 | - 2.3 Computing the Overlay of Two Subdivisions
18 | - 2.4 Boolean Operations
19 | - 2.5 Notes and Comments
20 | - 2.6 Exercises
21 |
22 | ### Chapter 3: Polygon Triangulation
23 |
24 | - 3.1 Guarding and Triangulations
25 | - 3.2 Partitioning a Polygon into Monotone Pieces
26 | - 3.3 Triangulating a Monotone Polygon
27 | - 3.4 Notes and Comments
28 | - 3.5 Exercises
29 |
30 | ### Chapter 4: Linear Programming
31 |
32 | - 4.1 The Linear Programming Problem
33 | - 4.2 Incremental Linear Programming
34 | - 4.3 Randomized Linear Programming
35 | - 4.4 Notes and Comments
36 | - 4.5 Exercises
37 |
38 | ### Chapter 5: Orthogonal Range Searching
39 |
40 | - 5.1 1-Dimensional Range Searching
41 | - 5.2 Kd-Trees
42 | - 5.3 Range Trees
43 | - 5.4 Higher-Dimensional Range Trees
44 | - 5.5 General Sets of Points
45 | - 5.6 Notes and Comments
46 | - 5.7 Exercises
47 |
48 | ## Part II: Geometric Data Structures
49 |
50 | ### Chapter 6: Point Location
51 |
52 | - 6.1 Point Location and Trapezoidal Maps
53 | - 6.2 A Randomized Approach
54 | - 6.3 Dealing with Degenerate Cases
55 | - 6.4 Notes and Comments
56 | - 6.5 Exercises
57 |
58 | ### Chapter 7: Voronoi Diagrams
59 |
60 | - 7.1 Post Office Problem
61 | - 7.2 Fortune's Algorithm
62 | - 7.3 Voronoi Diagrams of Line Segments
63 | - 7.4 Farthest-Point Voronoi Diagrams
64 | - 7.5 Notes and Comments
65 | - 7.6 Exercises
66 |
67 | ### Chapter 8: Arrangements and Duality
68 |
69 | - 8.1 Computing the Discrepancy
70 | - 8.2 Duality
71 | - 8.3 Arrangements of Lines
72 | - 8.4 Levels in Arrangements
73 | - 8.5 Notes and Comments
74 | - 8.6 Exercises
75 |
76 | ### Chapter 9: Delaunay Triangulations
77 |
78 | - 9.1 Triangulations of Point Sets
79 | - 9.2 The Delaunay Triangulation
80 | - 9.3 Computing the Delaunay Triangulation
81 | - 9.4 The Analysis
82 | - 9.5 Notes and Comments
83 | - 9.6 Exercises
84 |
85 | ### Chapter 10: More Geometric Data Structures
86 |
87 | - 10.1 Interval Trees
88 | - 10.2 Priority Search Trees
89 | - 10.3 Segment Trees
90 | - 10.4 Notes and Comments
91 | - 10.5 Exercises
92 |
93 | ## Part III: Geometric Algorithms
94 |
95 | ### Chapter 11: Convex Hulls
96 |
97 | - 11.1 The Complexity of Convex Hulls in 3-Space
98 | - 11.2 Computing Convex Hulls in 3-Space
99 | - 11.3 The Analysis
100 | - 11.4 Notes and Comments
101 | - 11.5 Exercises
102 |
103 | ### Chapter 12: Binary Space Partitions
104 |
105 | - 12.1 The Painter's Algorithm
106 | - 12.2 BSP Trees for Low-Density Scenes
107 | - 12.3 BSP Trees for Orthogonal Segments
108 | - 12.4 Notes and Comments
109 | - 12.5 Exercises
110 |
111 | ### Chapter 13: Robot Motion Planning
112 |
113 | - 13.1 Work Space and Configuration Space
114 | - 13.2 A Point Robot
115 | - 13.3 The Piano Movers' Problem
116 | - 13.4 Notes and Comments
117 | - 13.5 Exercises
118 |
119 | ### Chapter 14: Quadtrees
120 |
121 | - 14.1 Point-Region Quadtrees
122 | - 14.2 PR Quadtrees
123 | - 14.3 Region Quadtrees
124 | - 14.4 Notes and Comments
125 | - 14.5 Exercises
126 |
127 | ### Chapter 15: Visibility Graphs
128 |
129 | - 15.1 Computing Visibility Graphs
130 | - 15.2 Shortest Paths
131 | - 15.3 The Art Gallery Problem
132 | - 15.4 Hidden Surface Removal
133 | - 15.5 Notes and Comments
134 | - 15.6 Exercises
135 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [![Contributors][contributors-shield]][contributors-url]
2 | [![Forks][forks-shield]][forks-url]
3 | [![Stargazers][stars-shield]][stars-url]
4 | [![Issues][issues-shield]][issues-url]
5 | [][license-url]
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | 在线阅读 >>
16 |
17 |
18 | 代码案例(cg-examples)
19 | ·
20 | 参考资料
21 |
22 |
23 |
24 |
25 |
26 |
27 | # Introduction | 前言
28 |
29 | 本篇汇集了笔者对于计算机图形学基础理论知识、计算机视觉基础理论知识的笔记,然后讨论了数字化图像理论与厂家的图像处理、利用 Three.js/WebGL 等进行常见图像绘制等内容,最后还讨论了常见的数据可视化术语、工具等实现方式。
30 |
31 | # Nav | 关联导航
32 |
33 | - 本篇剥离自 [Frontend-Notes](https://github.com/wx-chevalier/Frontend-Notes?q=),更多 Web 开发相关内容请参阅[《Web-Notes](https://github.com/wx-chevalier/Web-Notes?q=)》。
34 |
35 | - 计算机视觉与深度学习相结合的内容请参阅[《DeepLearning-Notes](https://github.com/wx-chevalier/DeepLearning-Notes?q=)》
36 |
37 | # About | 关于
38 |
39 |
40 |
41 | ## Contributing
42 |
43 | Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
44 |
45 | 1. Fork the Project
46 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
47 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
48 | 4. Push to the Branch (`git push origin feature/AmazingFeature`)
49 | 5. Open a Pull Request
50 |
51 |
52 |
53 | ## Acknowledgements
54 |
55 | - [Awesome-Lists](https://github.com/wx-chevalier/Awesome-Lists): 📚 Guide to Galaxy, curated, worthy and up-to-date links/reading list for ITCS-Coding/Algorithm/SoftwareArchitecture/AI. 💫 ITCS-编程/算法/软件架构/人工智能等领域的文章/书籍/资料/项目链接精选。
56 |
57 | - [Awesome-CS-Books](https://github.com/wx-chevalier/Awesome-CS-Books): :books: Awesome CS Books/Series(.pdf by git lfs) Warehouse for Geeks, ProgrammingLanguage, SoftwareEngineering, Web, AI, ServerSideApplication, Infrastructure, FE etc. :dizzy: 优秀计算机科学与技术领域相关的书籍归档。
58 |
59 | ## Copyright & More | 延伸阅读
60 |
61 | 笔者所有文章遵循[知识共享 署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh),欢迎转载,尊重版权。您还可以前往 [NGTE Books](https://ng-tech.icu/books-gallery/) 主页浏览包含知识体系、编程语言、软件工程、模式与架构、Web 与大前端、服务端开发实践与工程架构、分布式基础架构、人工智能与深度学习、产品运营与创业等多类目的书籍列表:
62 |
63 | [](https://ng-tech.icu/books-gallery/)
64 |
65 |
66 |
67 |
68 | [contributors-shield]: https://img.shields.io/github/contributors/wx-chevalier/CG-Notes.svg?style=flat-square
69 | [contributors-url]: https://github.com/wx-chevalier/CG-Notes/graphs/contributors
70 | [forks-shield]: https://img.shields.io/github/forks/wx-chevalier/CG-Notes.svg?style=flat-square
71 | [forks-url]: https://github.com/wx-chevalier/CG-Notes/network/members
72 | [stars-shield]: https://img.shields.io/github/stars/wx-chevalier/CG-Notes.svg?style=flat-square
73 | [stars-url]: https://github.com/wx-chevalier/CG-Notes/stargazers
74 | [issues-shield]: https://img.shields.io/github/issues/wx-chevalier/CG-Notes.svg?style=flat-square
75 | [issues-url]: https://github.com/wx-chevalier/CG-Notes/issues
76 | [license-shield]: https://img.shields.io/github/license/wx-chevalier/CG-Notes.svg?style=flat-square
77 | [license-url]: https://github.com/wx-chevalier/CG-Notes/blob/master/LICENSE.txt
78 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | CGDataVis Series
7 |
8 |
9 |
11 |
12 |
13 |
14 |
15 |
32 |
35 |
37 |
42 |
43 |
44 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
89 |
90 |
91 |
92 |
101 |
102 |
103 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/17~Materials and Appearances.md:
--------------------------------------------------------------------------------
1 | ## 17.Materials and Appearances
2 |
3 | ### 17.1 Appearances
4 |
5 | 
6 |
7 | 现实世界中的光影材质非常多样和复杂。
8 |
9 | 比如光可能会在光路上和微粒碰撞漫反射出一条光路。
10 |
11 | 比如头发的丝质感,和微透明的感觉。
12 |
13 | 比如布料的纹理通常甚至需要考虑到其针织的方式。
14 |
15 | 日出的双彩虹现象。
16 |
17 | 还比如三文鱼肉的次表面反射。
18 |
19 | 等等
20 |
21 | ### 17.2 Material
22 |
23 | 
24 |
25 | 我们可以为一个模型指定不同的材质。
26 |
27 | 在渲染方程中,决定材质的正是 BRDF
28 |
29 | 
30 |
31 | 一个应用不同的 BRDF 的例子
32 |
33 | 
34 |
35 | 一个各向同性的点,接受的光和漫反射的光能量一致,可以根据能量守恒计算出其 BRDF 系数为 1/𝜋
36 |
37 | 所以要自然地定义一个漫反射点的反射系数,其值应该位于 [0,1/𝜋]
38 |
39 | 通常把这个值称为 albedo
40 |
41 | 
42 |
43 | 而这种靠近镜面反射,但又综合了漫反射性质的毛金属材质
44 |
45 | 
46 |
47 | 还有的材质可以折射透过表面,达到玻璃效果。
48 |
49 | ### 17.3 Reflection
50 |
51 | 
52 |
53 | 由入射光方向,计算镜面反射的出射的方法
54 |
55 | 
56 |
57 | 一个镜面反射的例子
58 |
59 | ### 17.4 Refraction
60 |
61 | 
62 |
63 | 折射的一些例子,偶尔需要对不同波长的光采用不同的折射率以模拟散射
64 |
65 | 
66 |
67 | 高中物理中的折射定律
68 |
69 | 
70 |
71 | 折射定律,且当入射角过大则不再有折射而发生全反射
72 |
73 | 
74 |
75 | 一个全反射的例子:在泳池中往上看,只有正中一块区域能看到外部。周围都只会反射而不再能看到水面以上。
76 |
77 | 
78 |
79 | 菲涅尔反射现象:入射光与法线角度越大越容易反射
80 |
81 | 
82 |
83 | 绝缘体的菲涅尔项的大致走势
84 |
85 | 
86 |
87 | 导体的菲涅尔项的大致走势
88 |
89 | 
90 |
91 | 菲涅尔项的一个常用近似函数
92 |
93 | ### 17.5 Microfacet Material
94 |
95 | 
96 |
97 | 同样的物体在不同的 Scale 下表现差异可能很大。比如海面波涛汹涌,但远看几乎光滑。
98 |
99 | 
100 |
101 | 因此光滑或者粗糙等性质其实是相对的,需要基于尺度。即使是人们用的镜子,放大看依旧是粗糙不堪的。
102 |
103 | 
104 |
105 | 或者体现在反射方向的分布方差越小,视觉上越光滑
106 |
107 | 
108 |
109 | 也是因此有菲涅尔项,因为通常越是斜着看,表面的凹凸越容易被相互遮挡而隐藏,留下相对光滑的表现。
110 |
111 | 
112 |
113 | 一些精细建模并渲染的例子
114 |
115 | ### 17.5 Isotropic
116 |
117 | 
118 |
119 | 各向异性的例子。
120 |
121 | 
122 |
123 | 源自于其材料在微观上表现有方向上的明显差异
124 |
125 | 
126 |
127 | 各项异性的 BRDF
128 |
129 | 由于对于这种材质需要考虑入射光和出射光关于材质本身的旋转角度,所以需要额外增加一维进行描述其 BRDF
130 |
131 | 
132 |
133 | 设置这类材质时需要考虑其生产或打磨的方式。比如锅是旋转拉丝制作的,所以其纹路呈环状
134 |
135 | 
136 |
137 | 尼龙由于其制作方式是织,导致 90 度和 45 度视角下表现有差异,虽然整体已经稍接近各向同性
138 |
139 | 
140 |
141 | 但天鹅绒,由于其局部的毛可能一起朝向一个方向,使其各向异性非常明显。
142 |
143 | 
144 |
145 | 天鹅绒沙发的各向异性非常明显
146 |
147 | ### 17.6 Properties of BRDFs
148 |
149 | 
150 |
151 | 非负性和可加性
152 |
153 | 
154 |
155 | 可逆性和能量守恒性
156 |
157 | 
158 |
159 | 前文的各向同性或各向异性
160 |
161 | ### 17.7 Measuring BRDFs
162 |
163 | 
164 |
165 | 物理上的一些材质性质和人工模拟的差别有可能很大。
166 |
167 | 所以用测量的方式可以更好地确定目标物体的性质,以达到更好的渲染结果。
168 |
169 | 
170 |
171 | 测量方式即遍历入射角和出射角
172 |
173 | 
174 |
175 | 一个实际的测量机器
176 |
177 | 
178 |
179 | 由于枚举入射和出射方向,数据量是四维的,量很恐怖,有一些方式可以略减少测量数据量
180 |
181 | 比如如果材质是各项同性的,则可以利用对称性,少测量一个维度。
182 |
183 | 
184 |
185 | 测量 BRDF 的一些挑战
186 |
187 | 
188 |
189 | 保存或表示 BRDF 的方法
190 |
191 | 
192 |
193 | 一个 BRDF 的数据库:MERL BRDF Database
194 |
--------------------------------------------------------------------------------
/01~真实感渲染/00~概述/学科方向.md:
--------------------------------------------------------------------------------
1 | > 参阅 [什么是计算机图形学?](http://staff.ustc.edu.cn/~lgliu/Resources/CG/What_is_CG.htm?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io)
2 |
3 | # 计算机图形学学科方向
4 |
5 | 在学科开创之初,计算机图形学要解决的是如何在计算机中表示三维几何图形,以及如何利用计算机进行图形的生成、处理和显示的相关原理与算法,产生令人赏心悦目的真实感图像。这是狭义的计算机图形学的范畴。随着近 40 年的发展,计算机图形学的内容已经远远不止这些了。广义的计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。
6 |
7 | 概括而言,计算机图形学主要包含四大部分的内容:建模(Modeling)、渲染(Rendering)、动画(Animation)和人机交互(Human–computer Interaction, HCI)。
8 |
9 | - 基于图形设备的基本图形元素的生成算法如用光栅图形显示器生成直线、圆弧、二次曲线、封闭边界内的图案填充等。
10 |
11 | - 图形元素的几何变换即对图形的平移、放、缩小、旋转、镜像等操作。
12 |
13 | - 自由曲线和曲面的值、拟合、拼接、分解、过渡、光顺、整体和局部修改等。
14 |
15 | - 三维几何造型技术,包括对基本体素的定义及输入、规则曲面与自由曲面的造型技术,以及它们之间的布尔运算方法的研究。
16 |
17 | - 三维形体的实时显示,包括投影变换、窗口剪裁等。
18 |
19 | - 真实感图形的生成算法,包括三维图形的消隐算法、光照模型的建立、阴影层次及彩色浓淡图的生成算法。
20 |
21 | - 山、水、花、草、烟云等模糊景物的模拟生成和虚拟现实环境的生成及其控制算法等。
22 |
23 | - 科学计算可视化和三维或高维数据场的可视化,包括将科学计算中大量难以理解的数据通过计算机图形显示出来,从而加深人们科学过程的理解,例如,有限元分析的结果等;应力场、磁场的分布等;各种复杂的运动学和动力学问题的图形仿真等。
24 |
25 | # 建模(Modeling)
26 |
27 | 要在计算机中表示一个三维物体,首先要有它的几何模型表达。因此,三维模型的建模是计算机图形学的基础,是其他内容的前提。表达一个几何物体可以是用数学上的样条函数或隐式函数来表达;也可以是用光滑曲面上的采样点及其连接关系所表达的三角网格来表达(即连续曲面的分片线性逼近),如下图所示。
28 |
29 | 
30 |
31 | 三维建模方法主要包含如下的一些方法:
32 |
33 | - 计算机辅助设计(CAD)中的主流方法是采用 NURBS(非均匀有理 B-样条、Bezier 曲线曲面)方法(已成为 CAD 工业领域的标准),这也是计算机辅助几何设计(CAGD)所研究的主要内容。此类表达方法有一些难点问题仍未解决,比如非正规情况下的曲面光滑拼合,复杂曲面表达等。这部分涉及的数学比较多,国内做这块的学者比较多些。
34 |
35 | - 细分曲面(Subdivision surface)造型方法,作为一种离散迭代的曲面构造方法,由于其构造过程朴素简单以及实现容易,是一个方兴未艾的研究热点。经过十多年的研究发展,细分曲面造型取得了较大的进展,包括奇异点处的连续性构造方法以及与 GPU 图形硬件相结合的曲面处理方法。
36 |
37 | - 利用软件的直接手工建模。现在主流的商业化的三维建模软件有 Autodesk 3D Max 和 Maya。其他还有面向特定领域的商业化软件,比如面向建筑模型造型的 Google Sketchup,面向 CAD/CAM/CAE 的 CATIA 和 AutoCAD,面向机械设计的 SolidWorks,面向造船行业的 Rhino 等。这些软件需要建模人员有较强的专业知识,而且需要一定时期的培训才能掌握,建模效率低而学习门槛高,不易于普及和让非专业用户使用。
38 |
39 | - 基于笔划或草图交互方式的三维建模方法。草图交互方式由于其符合人类原有日常生活中的思考习惯,交互方式直观简单,是最近几年研究的热点建模方法。其难点是根据具体的应用场合,如何正确地理解和识别用户的交互所表达的语义,构造出用户所希望的模型。
40 |
41 | - 基于语法及规则的过程式建模方法。特别适合具有重复特征和结构化的几何物体与场景,比如建筑、树木等。最近几年有较多的论文及较大的发展。
42 |
43 | - 基于图像或视频的建模方法。这是传统的计算机视觉所要解决的基本问题。在计算机图形学领域,这方面的发展也很迅速。有一些商业化软件或云服务(比如 Autodesk 的 123D),已经能从若干张照片重建出所拍摄物体的三维模型。该方法的问题是需要物体本身已经存在,而且重建的三维模型的精度有限。
44 |
45 | - 基于扫描点云(深度图像如 Kinect、结构光扫描、激光扫描、LiDAR 扫描等)的建模(Reconstruction)方法。随着深度相机的出现及扫描仪的价格迅速下降,人们采集三维数据变得容易,从采集到的三维点云来重建三维模型的工作在最近几年的 Siggraph(Asia)上能常见到。但是,单纯的重建方式存在精度低、稳定性差和运算量大等不足,远未能满足实际的需求。
46 |
47 | - 基于现有模型来合成建模的方法。随着三维模型的逐渐增多,可以利用现有的三维模型通过简单的操作,比如 cut and paste,或者分析及变形等手段,来拼接或合成新的三维模型。这种通过“学习”模型数据库的知识来进行建模的手段在近 3-5 年里研究得非常热门。从某方面来讲,就是“大数据时代”背景下计算机图形学领域中的一个具体的表现。
48 |
49 | 在对三维几何模型的构建过程中,还会涉及到很多需要处理的几何问题,比如数据去噪(denoising or smoothing)、补洞(repairing)、简化(simplification)、层次细节(level of detail)、参数化(parameterization)、变形(deformation or editing)、分割(segmentation)、形状分析及检索(shape analysis and retrieval)等。
50 |
51 | # 渲染(Rendering)
52 |
53 | 有了三维模型或场景,怎么把这些三维几何模型画出来,产生令人赏心悦目的真实感图像?这就是传统的计算机图形学的核心任务,在计算机辅助设计,影视动漫以及各类可视化应用中都对图形渲染结果的高真实感提出了很高的要求。上个世纪 80-90 年代研究的比较多些,包含了大量的渲染模型,包括局部光照模型(Local Illumination Model)、光线跟踪算法(Ray Tracing)、辐射度(Radiosity)等,以及到后面的更为复杂、真实、快速的渲染技术,比如全局光照模型(Global Illumination Model)、Photo mapping、BTF、BRDF、以及基于 GPU 的渲染技术等。
54 |
55 | 
56 |
57 | 现在的渲染技术已经能够将各种物体,包括皮肤、树木、花草、水、烟雾、毛发等渲染得非常逼真。一些商业化软件(比如 Maya, Blender, Pov Ray 等)也提供了强大的真实感渲染功能,在计算机图形学研究论文中作图中要经常用到这些工具来渲染漂亮的展示图或结果图。然而,已知的渲染实现方法,仍无法实现复杂的视觉特效,离实时的高真实感渲染还有很大差距,比如完整地实现适于电影渲染(高真实感、高分辨率)制作的 RenderMan 标准,以及其他各类基于物理真实感的实时渲染算法等。因此,如何充分利用 GPU 的计算特性,结合分布式的集群技术,从而来构造低功耗的渲染服务是发展趋势之一。
58 |
59 | # 动画(Animation)
60 |
61 | 动画是采用连续播放静止图像的方法产生物体运动的效果。计算机动画借助于编程或动画制作软件生成一系列的景物画面,是计算机图形学的研究热点之一。研究方向包括:人体动画,关节动画,运动动画,脚本动画,具有人的意识的虚拟角色的动画系统等。另外,高度物理真实感的动态模拟,包括对各种形变、水、气、云、烟雾、燃烧、爆炸、撕裂、老化等物理现象的真实模拟,也是动画领域的主要问题。这些技术是各类动态仿真应用的核心技术,可以极大地提高虚拟现实系统的沉浸感。计算机动画的应用领域广泛,比如动画片制作,广告、电影特技,训练模拟,物理仿真,游戏等。
62 |
63 | # 人机交互(Human–Computer Interaction, HCI)
64 |
65 | 人机交互(Human-Computer Interaction, 简写 HCI)是指人与计算机之间以一定的交互方式或交互界面,来完成确定任务的人与计算机之间的信息交换过程。简单来讲,就是人如何通过一定的交互方式告诉计算机来完成他所希望完成的任务。计算机图形学的顶级会议 ACM SIGGRAPH 是“ACM Special Interest Group on GRAPHics and Interactive Techniques”的缩写,缩写中只包含了 Graphics,而忽略了 Interactive Techniques,在长时间没有得到计算机图形学研究的重视。最近,包括在 SIGGRAPH 会议上,以及人机交互的顶级会议 SIGCHI 上,陆续出现了许多新兴的人机交互技术及研究论文。大家逐渐重视起来。
66 |
67 | 在早期(上个世纪 60-70 年代),只有以键盘输入的字符界面;到了 80 年代,以 WIMP(窗口、图符、菜单、鼠标)为基础的图形用户界面(GUI)逐渐成为当今计算机用户界面的主流。近年来,以用户为中心的系统设计思想,增进人机交互的自然性,提高人机交互的效率是用户界面的主要研究方向。陆续提出了多通道用户界面的思想,它包括语言、姿势输入、头部跟踪、视觉跟踪、立体显示、三维交互技术、感觉反馈及自然语言界面等。
68 |
69 | 事实上,人体的表面本身就是人机界面。人体的任何部分(姿势,手势,语言,眼睛,肌肉电波,脑波等)都可以成为人机对话的通道。比如 2010 年微软出的 Kinect 就是一种无需任何操纵杆的基于体感的人机界面,用户本身就是控制器。Kinect 在微软的 Xbox 游戏上取得了极大的成功,之后在其他方面也得到了很多的应用。
70 |
71 | # 其他
72 |
73 | 上述所提到的只是计算机图形学的主要的四个内容。事实上,与计算机图形学相关的学科还有很多,以下仅介绍几个最为相关的研究方向:
74 |
75 | l 虚拟现实(Virtual Reality):利用计算机图形产生器,位置跟踪器,多功能传感器和控制器等有效地模拟实际场景和情形,从而能够使观察者产生一种真实的身临其境的感觉。虚拟现实技术主要研究用计算机模拟(构造)三维图形空间,并使用户能够自然地与该空间进行交互。对三维图形处理技术的要求特别高。简单的虚拟现实系统早在 70 年代便被应用于军事领域,训练驾驶员。80 年代后随着计算机软硬件技术的提高,它也得到重视并迅速发展。它已在航空航天、医学、教育、艺术、建筑等领域得到初步的应用。
76 |
77 | - 可视化(Visualization):利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理的理论、方法和技术。现已成为研究数据表示、数据处理、决策分析等一系列问题的综合技术。上面提到的虚拟现实技术也是以图形图像的可视化技术为依托的。在现在的大数据时代的背景下,可视化的内容除了传统的科学可视化外,现在还有信息可视化,可视分析等方面。
78 |
79 | - 可视媒体计算与处理(Visual Media Processing):几何数据,被认为是继声音、图像、视频之后的新一代数字媒体,是计算机图形学的研究重点。最近几年,计算机图形学与图像视频处理技术相结合的研究与技术日益增多。正如笔者在上面所提及的,图像和视频的大数据处理能带给计算机图形学很多处理手段上的更新。另一方面,随着而计算机图形学技术,恰可以与这些图像处理,视觉方法相交叉融合,来直接地生成风格化的画面,实现基于图像三维建模,以及直接基于视频和图像数据来生成动画序列。当计算机图形学正向地图像生成方法和计算机视觉中逆向地从图像中恢复各种信息方法相结合,可以带来无可限量的想象空间,构造出很多视觉特效来,最终用于增强现实、数字地图、虚拟博物馆展示等多种应用中去。因此,在很多方面,计算机图形学与图像处理、视频处理、多媒体处理、计算机视觉等学科逐渐融合在一起,有成为一个更大的学科的趋势。
80 |
81 | - 医学图像处理(Medical Imaging):随着医学成像技术的发展与进步,图像处理在医学研究与临床医学中的应用越来越广泛。与一般意义上的图像处理比较,医学图像处理有其特殊性和不同的侧重点。医学图像处理由生物医学成像(X 射线、CT、MRI)和生物医学图像处理两部分组成,在生命科学研究、医学诊断、临床治疗等方面起着重要的作用。医学图像分析中涉及的两个最为重要的内容为图像分割与图像配准。
82 |
83 | - 计算机艺术(Computational Arts):计算机图形学的发展也提供给了艺术家发挥和实现想象的丰富的技术手段。计算机艺术的发展速度远远超出了人们的想象,在代表计算机图形研究最高水平的历届 SIGGRAPH 年会上,精彩的计算机艺术作品层出不穷。在计算机图形学领域,还有几个关于计算艺术方面的会议,包括非真实性图形学(Non-Photorealistic Graphics)和 Computational Aesthetics(计算美学)等。吸引了计算机工作者、艺术家、建筑师、设计师等方面的人员在一起,通过头脑风暴和交流讨论的方式进行一些有创意的技术研究。
84 |
85 | # 计算机图形学与图像处理
86 |
87 | 计算机图形学的基本含义是,使用计算机通过算法和程序在显示设备上构造出图形来。也就是说,图形是人们通过计算机设计和构造出来的,不是通过摄像机或扫描仪等设备输入的图像。所设计和构造的图形可以是现实世界中已经存在的物体图形,也可以显示出完全虚构的物体。因此,计算机图形学是真实物体或虚构物体的图形综合技术。与此相反,图像处理是景物或图像的分析技术。它所研究的是计算机图形学的逆过程,包括图像增强、模式识别、景物分析、计算机视觉等,并研究如何从图像中提取二维或三维物体的模型。
88 |
89 | 尽管计算机图形学和图像处理所涉及的都是用计算机来处理图形和图像,但是长期以来却属于不同的两个技术领域。近年来,由于媒体技术、计算机动画,三维空间动数据场显示及纹理映射等的迅速发展,计算机图形学和图像处理的结合日益紧密,并相互渗透。例如,将计算机生成的图形与扫描输入的图像结合起来,来构造计算机动画;用菜单或其他图形交互技术来实现交互式图像处理;通过交互手段,由一幅透视图像中提取出对称物体的三维模型并进行修改,也可由一幅图像,直接变换为另一幅图像从而代替了图形的综合等。计算机图形学与图像处理相结合,加速了这两个相关领域的发展。
90 |
--------------------------------------------------------------------------------
/99~参考资料/2020~计算机图形学学习笔记/01~绪论.md:
--------------------------------------------------------------------------------
1 | # 绪论
2 |
3 | ### 全书概述
4 |
5 | - 图形学基本知识
6 | - 光栅图形学
7 | - 扫描转换、区域填充、裁减、反走样、消隐
8 | - 二维、三维图形变换及观察准均匀 B 样条曲线
9 | - 几何造型
10 | - 参数曲线曲面基本概念、Bezier 曲线曲面、B 样条曲线等
11 | - 真实感图形学
12 | - 颜色模型、简单光照模型、纹理映射、光线跟踪
13 |
14 | ### 计算机图形学定义
15 |
16 | - 计算机图形学
17 | - 计算机图形是计算机产生的图像。
18 | - 计算机图形学就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理和算法。
19 | - IEEE 定义:Comput graphics is the art or science of producing graphical images with the aid of computer.
20 | - 计算机图形学的发展和应用在某种意义上已成为计算机软、硬件发展水平的标志。
21 |
22 | ### 计算机图形学研究内容
23 |
24 | - 主要研究内容
25 | - 如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法,构成了计算机图形学的主要研究内容。
26 | - 计算机生成一副表示物体的图形的三个步骤
27 | - 造型技术
28 | - 在计算机中建立所要生成图像的物体的模型,即给出表示该物体的几何数据和拓扑关系
29 | - 比如教室里的桌子、椅子、墙,用圆柱、平面等表示出来。
30 | - 光照模型
31 | - 希望用一些简单的数学模型来近似、代替那些物理学的模型,为模拟物体表面的光照物理现象的数学模型叫光照模型。
32 | - 绘制(渲染)技术
33 | - 选择适当的绘制算法来把这个场景画 (渲染) 出来。
34 | - 绘制一幅三维物体图像所涉及的知识,实际上就是计算机图形中每个像素看上去应该是什么颜色的问题。
35 | - 计算机图形的发展方向
36 | - 准确性 -> 真实性 -> 实时性
37 |
38 | ### 计算机图形学的发展历史
39 |
40 | - 1950 年,第一台图形显示器作为美国麻省理工学院 (MIT) 旋风 I 号计算机的附件诞生。
41 |
42 | - 1963 年,Suther land 发表博士论文。其中第一次提出了 graphics 这个词。
43 |
44 | - **Suther land 被公认为开创交互式图形技术的奠基人,被称为 “计算机图形学之父”,并于 1988 年获 “图灵奖”。**
45 |
46 | - 1962 年,雷诺汽车公司的工程师 Bezier 提出 Bezier 曲线、曲面的理论,成为 CAGD (计算机辅助几何设计) 的先驱。
47 |
48 | - 1964 年,MIT 教授 Steven A. Coons 提出了超限插值的新思想,通过插值四条任意的边界曲线来构造曲面。
49 |
50 | - 70 年代,光栅显示器出现了。光栅显示器屏幕是由像素组成的,由此诞生了大量算法,如区域填充、裁剪、消隐等基本图形概念、及其相应算法。
51 |
52 | - 真实感图形和几何造型技术这个时候也开始出现了。
53 |
54 | - 1975 年,Phong 提出了著名的简单光照模型 - Phong 模型 (标志着真实感图形的出现和实用化,直到现在 Phong 模型还被大量的采用)
55 |
56 | - 1980 年,Whitted 提出了光透视模型 - Whitted 模型,成为第一次提出光线跟踪算法的范例。
57 |
58 | - 几何造型技术:通俗地讲,该技术就像小孩搭积木,用简单的一些体素来构建复杂的模型。
59 |
60 | [](https://zhangt.top/CS/Computer-Graphics-Study-Notes/1560589193983.png)
61 |
62 | ### 计算机图形学的应用领域
63 |
64 | - 人机交互和图形用户界面
65 | - 最理想的是开发 “能听、能说、能理解人类语言” 的计算机,人们可以和计算机交谈,而不像现在这样仅限于窗口、图标、鼠标、指针 (WIMP) 界面。
66 | - 计算机辅助设计与制造 (CAD/CAM)
67 | - CAD/CAM 是计算机图形学在工业界最广泛、最活跃的应用领域。
68 | - 飞机、汽车、船舶、宇宙飞船的外形设计
69 | - 发电厂、化工厂等的布局
70 | - 真实感图形实时绘制与自然景物仿真
71 | - 计算机中重现真实世界的场景叫做真实感绘制。
72 | - 计算机动画、游戏、电影
73 | - 计算机艺术
74 | - 计算机艺术是科学与技术相结合的一门新兴的交叉学科,是计算机应用的一个崭新、富有时代气息的领域。
75 | - 计算机仿真
76 | - 计算机仿真是计算机技术建立被仿真系统的模型,并在某些实验条件下对模型进行动态实验的一门综合性技术。
77 | - 科学计算可视化
78 | - 虚拟现实
79 | - 虚拟现实是利用计算机模拟现实的场景,使参与者获得与现实一样的感觉。
80 | - 准确地说,是利用电脑模拟产生一个三维空间的虚拟世界,提供使用者关于视觉、听觉、触觉等感官的模拟,让使用者如同身历其境一般,可以及时、没有限制地观察三度空间内的事物。
81 | - 地理信息系统
82 | - 地理信息系统是建立在地理图形之上的关于各种资源的综合信息管理系统,是计算机图形学的一个重要应用领域。
83 | - 农业上的应用
84 | - 借助计算机图形生成技术来保存和再现不同作物种类和不同生长时期的植物形态,模拟植物的生长过程,从而合理地进行选种、播种、田间管理以及收获等。
85 |
86 | 计算机图形系统组成
87 |
88 | - 五大功能
89 |
90 | - 一个交互式计算机图形系统应具有计算、存储、对话、输入和输出等 5 个方面的功能。
91 |
92 | [](https://zhangt.top/CS/Computer-Graphics-Study-Notes/1560589234970.png)
93 |
94 | - 图形系统
95 |
96 | - 图形软件
97 | - 图形应用数据结构:对应一组图形数据文件,其中存放着欲生成的图形对象的全部描述信息。
98 | - 图形应用软件
99 | - 解决某种应用问题的图形软件,是图形系统中的核心部分,包括了各种图形生成和处理技术。如:photoshop、3Dmax 等。
100 | - 图形支撑软件:大多数图形应用程序是建立在一定的图形支撑软件上。图形支撑软件需具有规范接口。
101 | - 图形硬件
102 |
103 | ### 图形显示设备
104 |
105 | - 阴级射线管
106 | - 使用广泛:现在的图形显示设备绝大多数是基于阴极射线管 (CRT) 的显示器。
107 | - 阴极射线管的技术指标
108 | - **分辨率:一个阴极射线管在水平和垂直方向单位长度上能识别出的最大光点数称之为分辨率。光点亦称之为像素 (pixel)。**
109 | - 显示速度
110 | - 要保持荧光屏上有稳定的图像就必须不断地发射电子束。只有刷新频率高到一定值后,图像才能稳定显示。大约达到每秒 60 帧即 60Hz 时,人眼才能感觉到屏幕不闪烁,要人眼觉得舒服,一般必须有 85Hz 以上的刷新频率。
111 | - 彩色阴极射线管
112 | - 三只电子枪,分别涂有红、绿、蓝三种颜色的光。
113 | - CRT 图形显示器
114 | - 随机扫描的图形显示器 (画线设备)
115 | - 电子束的扫描轨迹随显示内容而变化,只在需要的地方扫描,而不必全屏扫描,因此速度快,图像清晰。
116 | - 一条线一条线地画图,因此也称为向量显示器。
117 | - 随机扫描系统是为画线应用设计的,因此不能显示逼真的有阴影场景。
118 | - 光栅扫描显示器 (画点设备)
119 | - 不能直接从一个可编地址的像素画一条直线到另一个可编地址的像素,只可能用尽可能靠近这条直线路径的像素点来近似地表示这条直线。
120 | - 在光栅扫描系统中,电子束横向扫描屏幕,一次一行,从上到底顺次进行。当电子束横向沿每一行移动时,电子束的强度不断变化来建立亮点的图案。
121 | - 由于光栅扫描系统具有存储每一个屏幕点亮度信息的能力,所以,最适合显示浓淡和色彩图形。
122 | - 例题:显卡有 2MB 显存,当分辨率为 1024×768 时,可支持的色彩数是多少?
123 | 2MB=2×1024×1024=2097152(字节)=2×1024×1024=2097152(字节)
124 | 1024×768=786432(个像素)1024×768=786432(个像素)
125 | 每个像素如果需要 3 个字节表示,将超过 2MB 显存,最多只需要 2 个字节表示,故只能支持 64K 色彩数
126 |
127 | ### 图形学相关概念
128 |
129 | - 分辨率
130 | - 光点
131 | - 光点指电子束打在显示器荧光屏上,显示器能够显示的最小的发光点,一般用其直径来表明光点的大小。
132 | - 像素点
133 | - 像素点是指图形显示在屏幕上时候,按当前的图形显示分辨率所能提供的最小元素点。
134 | - 屏幕分辨率
135 | - 屏幕上显示的像素个数,以 (水平像素数 \* 垂直像素数) 表示。
136 | - 显示分辨率
137 | - 是计算机显示控制器所能够控制的显示模式分辨率,简称显示模式。
138 | - 对于文本显示方式,显示分辨率用水平和垂直方向上所能显示的字符总数的乘积来表示。
139 | - 对于图形显示方式,则用水平和垂直方向上所能显示的像素点总数的乘积来表示。
140 | - 显卡分辨率
141 | - 显卡分辨率就是表示显卡输出给显示器,并能在显示器上描绘像素点的数量。
142 | - 一台电脑的最高分辨率是由显卡和显示器共同决定的。显示器最高分辨率是可以显示出来的最大分辨率。显卡的最大分辨率是最大能支持多少分辨率。
143 | - 电脑的最高分辨率取决于显卡和显示器最低的一个。
144 | - 显示器的点距
145 | - 指相邻像素点之间的距离。两点之间的距离越小越好。
146 | - 15 寸显示器,点距达到 0.28mm 就足够。17 寸显示器,需要 0.27mm、0.25mm 等。
147 | - 显示卡的作用与性能指标
148 | - 显示卡的基本作用就是显示图文,显示卡和显示器构成了计算机的显示系统。
149 | - 除了 CPU 和内存外,显卡对计算机的显示性能起着决定性的作用。
150 |
151 | ### 图形图像的区别及存储格式
152 |
153 | - 图形图像的区别
154 |
155 | - 说法一
156 | - 图形是由计算机绘制而成的,而图像则是人为的用外部设备所捕捉到的外部的景象。
157 | - 说法二
158 | - 图形是矢量图,而图像是位图 (点阵图)
159 |
160 | - 图形 (像) 的构成属性
161 |
162 | - 几何属性
163 | - 刻画对象的轮廓、形状。包括点、线、面、体等。
164 | - 非几何属性
165 | - 视觉属性,刻画对象的颜色、材质等。包括明暗、色彩、纹理、透明性、线型、线宽。
166 | - 从构图要素上看,将图形分为两类
167 | - 几何属性有突出作用:工程图、等高线地图、曲面的线框图
168 | - 非几何属性有突出作用 (明暗图):真实感图形
169 |
170 | - 位图和矢量图定义
171 |
172 | - 位图 (点阵图)
173 | - 点阵图或像素图,计算机屏幕上的图是由屏幕上的像素构成的,每个点用二进制数据来描述其颜色与亮度等信息。
174 | - 矢量图
175 | - 面向对象的图形或绘图图形,是用数学方式描述的曲线及曲线围成的色块制作的图形。
176 | - 矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。
177 |
178 | - 位图和矢量图区别
179 |
180 | - 存储方式的区别
181 |
182 | - 点阵文件存储图的各个像素点的位置信息、颜色信息以及灰度信息。
183 | - 矢量文件是用数学方程、数学形式对图形进行描述,通常使用图形的形状参数和属性参数来表示图形。
184 | - 因此,点阵文件存储空间比矢量文件大。
185 |
186 | - 缩放的区别
187 |
188 | - 点阵文件与分辨率有关,即在一定面积的图像上包含有固定数量的像素。
189 | - 矢量图形与分辨率无关,可以将它缩放到任意大小和以任意分辨率在输出设备上打印出来,不会影响清晰度。
190 |
191 | - 存储格式的区别
192 |
193 | - 位图存储格式:BMP、TIFF、GIF、JPEG、PNG
194 | - 矢量图存储格式:DXF、SVG、EPS、WMF、EMF
195 |
196 | - 总结
197 |
198 | | | 位图 | 矢量图 |
199 | | :------------- | :------------------------------------- | :---------------------- |
200 | | 存储内容 | 各像素点位置信息、颜色信息以及灰度信息 | 数学方程 |
201 | | 存储空间 | 大 | 小 |
202 | | 常见存储格式 | BMP、TIFF、GIF、JPEG、PNG | DXF、SVG、EPS、WMF、EMF |
203 | | 图形缩放 | 失真 | 不失真 |
204 | | 真实感图形效果 | 容易实现 | 不容易实现 |
205 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/Cursor 摘要/01~计算几何基础.md:
--------------------------------------------------------------------------------
1 | # 第一章:计算几何基础
2 |
3 | ## 一、计算几何概述
4 |
5 | ### 1.1 学科定义
6 |
7 | 计算几何(Computational Geometry)是计算机科学的一个分支,主要研究:
8 |
9 | 1. 几何问题的算法设计
10 | 2. 几何算法的复杂度分析
11 | 3. 几何数据结构的设计与实现
12 |
13 | ### 1.2 应用领域
14 |
15 | 1. 计算机图形学
16 |
17 | - 碰撞检测
18 | - 可见性计算
19 | - 路径规划
20 |
21 | 2. 地理信息系统(GIS)
22 |
23 | - 空间数据处理
24 | - 地图叠加分析
25 | - 区域查询
26 |
27 | 3. CAD/CAM 系统
28 | - 几何建模
29 | - 工具路径生成
30 | - 干涉检查
31 |
32 | ## 二、基础数据结构
33 |
34 | ### 2.1 点的表示
35 |
36 | ```cpp
37 | // 2D点
38 | struct Point2D {
39 | double x, y;
40 |
41 | Point2D(double x = 0, double y = 0) : x(x), y(y) {}
42 |
43 | // 向量加法
44 | Point2D operator+(const Point2D& p) const {
45 | return Point2D(x + p.x, y + p.y);
46 | }
47 |
48 | // 向量减法
49 | Point2D operator-(const Point2D& p) const {
50 | return Point2D(x - p.x, y - p.y);
51 | }
52 |
53 | // 点积
54 | double dot(const Point2D& p) const {
55 | return x * p.x + y * p.y;
56 | }
57 |
58 | // 叉积
59 | double cross(const Point2D& p) const {
60 | return x * p.y - y * p.x;
61 | }
62 | };
63 |
64 | // 3D点
65 | struct Point3D {
66 | double x, y, z;
67 |
68 | Point3D(double x = 0, double y = 0, double z = 0)
69 | : x(x), y(y), z(z) {}
70 |
71 | // 向量加法
72 | Point3D operator+(const Point3D& p) const {
73 | return Point3D(x + p.x, y + p.y, z + p.z);
74 | }
75 |
76 | // 向量叉积
77 | Point3D cross(const Point3D& p) const {
78 | return Point3D(y * p.z - z * p.y,
79 | z * p.x - x * p.z,
80 | x * p.y - y * p.x);
81 | }
82 | };
83 | ```
84 |
85 | ### 2.2 线段与直线
86 |
87 | ```cpp
88 | struct Line2D {
89 | // ax + by + c = 0
90 | double a, b, c;
91 |
92 | Line2D(const Point2D& p1, const Point2D& p2) {
93 | a = p2.y - p1.y;
94 | b = p1.x - p2.x;
95 | c = p2.x * p1.y - p1.x * p2.y;
96 | }
97 |
98 | // 点到直线距离
99 | double distance(const Point2D& p) const {
100 | return fabs(a * p.x + b * p.y + c) / sqrt(a * a + b * b);
101 | }
102 | };
103 |
104 | struct Segment2D {
105 | Point2D p1, p2;
106 |
107 | Segment2D(const Point2D& p1, const Point2D& p2) : p1(p1), p2(p2) {}
108 |
109 | // 判断点是否在线段上
110 | bool contains(const Point2D& p) const {
111 | // 首先检查共线
112 | if(abs((p2 - p1).cross(p - p1)) > EPS) return false;
113 |
114 | // 然后检查是否在线段范围内
115 | if(p.x < min(p1.x, p2.x) || p.x > max(p1.x, p2.x)) return false;
116 | if(p.y < min(p1.y, p2.y) || p.y > max(p1.y, p2.y)) return false;
117 |
118 | return true;
119 | }
120 | };
121 | ```
122 |
123 | ### 2.3 多边形
124 |
125 | ```cpp
126 | class Polygon {
127 | private:
128 | vector vertices;
129 |
130 | public:
131 | void addVertex(const Point2D& p) {
132 | vertices.push_back(p);
133 | }
134 |
135 | // 计算多边形面积
136 | double area() const {
137 | double result = 0;
138 | int n = vertices.size();
139 | for(int i = 0; i < n; i++) {
140 | result += vertices[i].cross(vertices[(i + 1) % n]);
141 | }
142 | return fabs(result) / 2;
143 | }
144 |
145 | // 判断点是否在多边形内
146 | bool contains(const Point2D& p) const {
147 | bool inside = false;
148 | int n = vertices.size();
149 |
150 | for(int i = 0, j = n - 1; i < n; j = i++) {
151 | if(((vertices[i].y > p.y) != (vertices[j].y > p.y)) &&
152 | (p.x < (vertices[j].x - vertices[i].x) *
153 | (p.y - vertices[i].y) / (vertices[j].y - vertices[i].y) +
154 | vertices[i].x)) {
155 | inside = !inside;
156 | }
157 | }
158 |
159 | return inside;
160 | }
161 | };
162 | ```
163 |
164 | ## 三、基本几何运算
165 |
166 | ### 3.1 向量运算
167 |
168 | ```cpp
169 | namespace VectorOps {
170 | // 向量长度
171 | double length(const Point2D& v) {
172 | return sqrt(v.x * v.x + v.y * v.y);
173 | }
174 |
175 | // 向量单位化
176 | Point2D normalize(const Point2D& v) {
177 | double len = length(v);
178 | return Point2D(v.x / len, v.y / len);
179 | }
180 |
181 | // 向量旋转
182 | Point2D rotate(const Point2D& v, double angle) {
183 | double cos_a = cos(angle);
184 | double sin_a = sin(angle);
185 | return Point2D(v.x * cos_a - v.y * sin_a,
186 | v.x * sin_a + v.y * cos_a);
187 | }
188 | }
189 | ```
190 |
191 | ### 3.2 角度计算
192 |
193 | ```cpp
194 | namespace AngleOps {
195 | const double PI = 3.14159265358979323846;
196 |
197 | // 弧度转角度
198 | double toDegrees(double rad) {
199 | return rad * 180.0 / PI;
200 | }
201 |
202 | // 角度转弧度
203 | double toRadians(double deg) {
204 | return deg * PI / 180.0;
205 | }
206 |
207 | // 计算两个向量的夹角
208 | double angle(const Point2D& v1, const Point2D& v2) {
209 | double dot = v1.dot(v2);
210 | double cross = v1.cross(v2);
211 | return atan2(cross, dot);
212 | }
213 | }
214 | ```
215 |
216 | ### 3.3 方向判断
217 |
218 | ```cpp
219 | namespace Orientation {
220 | // 判断点p3相对于向量p1->p2的方向
221 | int direction(const Point2D& p1, const Point2D& p2, const Point2D& p3) {
222 | double val = (p2.y - p1.y) * (p3.x - p2.x) -
223 | (p2.x - p1.x) * (p3.y - p2.y);
224 |
225 | if(fabs(val) < EPS) return 0; // 共线
226 | return (val > 0) ? 1 : -1; // 1表示左转,-1表示右转
227 | }
228 |
229 | // 判断点是否在线段上
230 | bool onSegment(const Point2D& p, const Point2D& q, const Point2D& r) {
231 | return q.x <= max(p.x, r.x) && q.x >= min(p.x, r.x) &&
232 | q.y <= max(p.y, r.y) && q.y >= min(p.y, r.y);
233 | }
234 | }
235 | ```
236 |
237 | ## 四、数值计算考虑
238 |
239 | ### 4.1 精度控制
240 |
241 | ```cpp
242 | namespace Precision {
243 | const double EPS = 1e-10; // 精度常量
244 |
245 | // 浮点数比较
246 | bool equals(double a, double b) {
247 | return fabs(a - b) < EPS;
248 | }
249 |
250 | // 符号判断
251 | int sign(double x) {
252 | if(fabs(x) < EPS) return 0;
253 | return x > 0 ? 1 : -1;
254 | }
255 |
256 | // 浮点数比较器
257 | struct DoubleComparator {
258 | bool operator()(double a, double b) const {
259 | return a < b - EPS;
260 | }
261 | };
262 | }
263 | ```
264 |
265 | ### 4.2 退化情况处理
266 |
267 | ```cpp
268 | namespace DegenerateCase {
269 | // 判断三点是否共线
270 | bool collinear(const Point2D& p1, const Point2D& p2, const Point2D& p3) {
271 | return Orientation::direction(p1, p2, p3) == 0;
272 | }
273 |
274 | // 判断点集是否都共线
275 | bool allCollinear(const vector& points) {
276 | if(points.size() <= 2) return true;
277 |
278 | for(size_t i = 2; i < points.size(); i++) {
279 | if(!collinear(points[0], points[1], points[i])) {
280 | return false;
281 | }
282 | }
283 | return true;
284 | }
285 | }
286 | ```
287 |
288 | ## 五、总结
289 |
290 | 计算几何基础的关键点:
291 |
292 | 1. 数据结构设计
293 |
294 | - 需要支持基本几何运算
295 | - 考虑数值精度问题
296 | - 提供便捷的接口
297 |
298 | 2. 基本运算实现
299 |
300 | - 向量运算
301 | - 角度计算
302 | - 方向判断
303 |
304 | 3. 实现注意事项
305 |
306 | - 浮点数精度控制
307 | - 特殊情况处理
308 | - 数值稳定性
309 |
310 | 4. 应用考虑
311 | - 算法效率
312 | - 代码复用
313 | - 可维护性
314 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/05-06~Rasterization.md:
--------------------------------------------------------------------------------
1 | # Rasterization
2 |
3 | 这节课主要介绍光栅化本身,和现代光栅化的对象–三角形 相关的一些操作。即在经过将场景进行基本变换后,如何将变换后的正方形内容呈现在屏幕上。
4 |
5 | # 介绍成像
6 |
7 | 
8 |
9 | 首先弄清楚什么是屏幕。再弄清楚像素,Pixel 原来是 picture element 的浓缩版。
10 |
11 | 
12 |
13 | 定义屏幕空间,和每个像素的坐标表示方法,此时介绍一下各种成像设备(不仅仅是矩阵式像素成像、甚至不仅仅是屏幕)。
14 |
15 | 
16 |
17 | 
18 |
19 | 绘制机也算作成像设备,但并非用屏幕,事实上即使用屏幕,也不一定是像素阵列。
20 |
21 | 
22 |
23 | 
24 |
25 | 
26 |
27 | 
28 |
29 | 
30 |
31 | # 三角形
32 |
33 | 
34 |
35 | 选用三角形作为基本形体单位的原因。
36 |
37 | 
38 |
39 | 但应该如何把一个三角形给光栅化呢?
40 |
41 | 
42 |
43 | 一种方式是对每个像素去采样,中心在三角形内即标内部颜色,否则标外部颜色。判断像素是否在三角形以内可以用叉积判断点是否在三条边(全逆时针或全顺时针)的同侧。同即内部,否则外部。
44 |
45 | 
46 |
47 | 对于刚好在边界的情况,通常只要自己定义清楚就行,在哪边都不会有太大影响(OpenGL 会根据是否是左上的边进行区别选择)
48 |
49 | 
50 |
51 | 
52 |
53 | 一些加速遍历的方法:
54 |
55 | 
56 |
57 | 一些实际机器上的像素排列。三星 Galaxy S5 的排列方式可以节省一些像素点。绿色偏多是由于人眼对绿色更敏感。
58 |
59 | 
60 |
61 | 一些其他的成像算法。比如打印机用这种排列,目的主要是为了节省油墨。
62 |
63 | # Antialiasing and Z-buffering
64 |
65 | 
66 |
67 | 
68 |
69 | 事实上仅仅用上节提到的采样方法,会得到这样的结果。非常不像我们想要的三角形。
70 |
71 | 
72 |
73 | 甚至还有更严重的事情发生,比如采样得到了完全不同的花纹,这已经不是锯齿的问题了。
74 |
75 | 
76 |
77 | 还有这种运动错觉(同偶尔看到车轮反转的错觉)这些问题出在哪呢?
78 |
79 | 
80 |
81 | 都是采样造成的问题,对于其中的锯齿问题:
82 |
83 | 
84 |
85 | 如果考察照相机(照片一般不会有这种问题),会发现位于边界的每个像素会吸收边界两边的光子,得到一个混合的结果,使整体看上去边界顺滑自然。
86 |
87 | 
88 |
89 | 采样时也理应可以做到人工边界模糊,达到接近相机的效果。比如先模糊,再采样。
90 |
91 | 
92 |
93 | 效果还不错:
94 |
95 | 
96 |
97 | 但做这种事情时需要注意顺序:需要先模糊再采样,而非先采样再模糊。
98 |
99 | # 背后的信号原理
100 |
101 | 
102 |
103 | 针对于前面的现象,应该如何解释呢?
104 |
105 | 
106 |
107 | 这可以追溯至傅立叶变换:高频信号需要更高的采样率才能保证不失真。
108 |
109 | 
110 |
111 | 越高频的信号要求越高频的采样,否则会出现走样,对于图片而言,也可以进行二维的傅立叶分解
112 |
113 | 
114 |
115 | 频域上的两条直线线主要由于做变换时等效于将图片横纵重复了很多次,而边界往往是非常难匹配的,即对应了高频变化。
116 |
117 | 
118 |
119 | 频域上越远离中心,在时域上越对应突变的边:
120 |
121 | 
122 |
123 | 低频则对应于模糊:
124 |
125 | 
126 |
127 | 卷积定理:时域上的卷积,对应频域上的乘积。而频域上的卷积,对应时域上的乘积。
128 |
129 | 
130 |
131 | 卷积定理的一个例子:
132 |
133 | 
134 |
135 | 而对于一个时域上的函数 a,对其进行固定间隔采样的操作实质等效于用一系列冲击函数 c 去和 a 乘,最后得到 e。根据卷积定理,时域上的乘积对应频域上的卷积。假设 a 对应的频域为 b。而冲击函数 c 对应的频域为 d。b 和 d 卷积后则理应得到 f。
136 |
137 | 
138 |
139 | 这时我们可以看出如果原始函数比较低频,即对应的频域函数局限在较小区域,则在采样之后不会有重叠。否则,则会在频域上有重叠,进而对于重叠部分无法区分是重叠导致的,还是原始信号天生如此,造成走样。
140 |
141 | 
142 |
143 | 据此,分析反走样的原理也就比较容易了。要么提高采样频率,相当于增大频域上的间隔,使其不容易重叠。
144 |
145 | 
146 |
147 | 也可以通过模糊化操作,使其不包含高频信号,以至于不会重叠:
148 |
149 | 
150 |
151 | 
152 |
153 | 除了模糊化以外,还可以采用对单个像素密集采样求平均的方法来减少锯齿或走样问题。
154 |
155 | 
156 |
157 | 也能达到很好的效果,不过与此同时也需要付出计算代价。
158 |
159 | 
160 |
161 | # 光栅化一个场景
162 |
163 | 知道了如何光栅化一个三角形,再介绍如何光栅化一个场景。
164 |
165 | 
166 |
167 | 为了解决远近覆盖问题。容易想到的一种处理方式是画家算法:由远往近依次画。画的时候近处物体覆盖远处物体。
168 |
169 | 
170 |
171 | 但这样做也是有局限的。特别是有些情况下难以对三角形进行远近排序。
172 |
173 | 
174 |
175 | 对三角形难以远近排序,对像素却是可以做到的,所以有了 Z-Buffer 算法。每个像素用 Z 最近的光栅化值。
176 |
177 | 
178 |
179 | 实际上等效于在记录 RGB 三色的同时,加入 Depth 的记录。
180 |
181 | 
182 |
183 | 由于只用找最小,而不是排序,所以 Z-Buffer 复杂度仅 𝑂(𝑛),且为了更高的运行效率,Z-Buffer 已经集成在了各个 GPU 内部,直接硬件层面支持。
184 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/21-22~Animation.md:
--------------------------------------------------------------------------------
1 | # Animation
2 |
3 | ## 21.Animation
4 |
5 | ### 21.1 Historical Points in Animation
6 |
7 | 
8 |
9 | 远古时期的壁画,可以连成动图
10 |
11 | 
12 |
13 | 后来可以通过旋转得到动图
14 |
15 | 
16 |
17 | 第一步手绘的完整动画
18 |
19 | 
20 |
21 | 里程碑式作品
22 |
23 | 
24 |
25 | 第一个纯计算机渲染的动画,当时还用的是光栅化
26 |
27 | ### 21.2 Keyfram Animation
28 |
29 | 
30 |
31 | 最早由艺术家绘制关键帧,由助手补上中间的帧
32 |
33 | 
34 |
35 | 关键帧插值
36 |
37 | ### 21.3 Physical Simulation
38 |
39 | 而现在的动画制作,为了更好的效果往往需要模拟或者仿真
40 |
41 | 
42 |
43 | 
44 |
45 | 布料仿真
46 |
47 | 
48 |
49 | 流体仿真
50 |
51 | ### 21.4 Mass Spring System
52 |
53 | 
54 |
55 | 
56 |
57 | 
58 |
59 | 模拟的布料,建模得足够好之后非常接近真实效果
60 |
61 | 
62 |
63 | 一个简单的质点弹簧模型
64 |
65 | 
66 |
67 | 带静态长度的弹簧
68 |
69 | 
70 |
71 | 带能量损失的弹簧,摩擦力与质点速度相反
72 |
73 | 
74 |
75 | 增加与相对速度相反的摩擦力的模型
76 |
77 | 
78 |
79 | 通常用的质点弹簧系统的模型,同时考虑很多性质
80 |
81 | 1. 多个角度牵拉
82 | 2. 弯折
83 |
84 | 
85 |
86 | 也可以用有限元方法建模和仿真,可以替代弹簧系统
87 |
88 | ### 21.5 Particle Systems
89 |
90 | 
91 |
92 | 有些东西不太适合有限元或者质点弹簧系统
93 |
94 | 但可以利用粒子系统,并模拟粒子间的作用(碰撞、引力等等)
95 |
96 | 
97 |
98 | 粒子系统模拟的粗略过程
99 |
100 | 
101 |
102 | 粒子系统的一些力
103 |
104 | 
105 |
106 | 粒子系统模拟水
107 |
108 | 
109 |
110 | 粒子系统模拟鸟群
111 |
112 | 给每只鸟定义其运动模式,合起来即可模拟鸟群
113 |
114 | ### 21.6 Forward Kinematics
115 |
116 | 
117 |
118 | 正向运动学是定义模型并操作模型运动
119 |
120 | 
121 |
122 | 只要从根依次运算即可
123 |
124 | 
125 |
126 | 坏处是艺术家们并不太方便使用这种不直观的设置方式,更喜欢能够直接拖拽的控制
127 |
128 | ### 21.7 Inverse Kinematics
129 |
130 | 于是有了逆运动学
131 |
132 | 
133 |
134 | 比如设定好想要的轨迹,自动反解出各个关节应该在的地方
135 |
136 | 
137 |
138 | 两个关节的反解例子
139 |
140 | 
141 |
142 | 但由于解往往并不惟一,容易导致抖动,这是求解比较难的原因之一
143 |
144 | 
145 |
146 | 并且,有的时候还可能并不存在解
147 |
148 | 
149 |
150 | 通常的求解方法类似机器学习,定义误差矩阵,采用梯度下降
151 |
152 | ### 21.8 Rigging
153 |
154 | 
155 |
156 | 设置控制点进行控制
157 |
158 | 
159 |
160 | 
161 |
162 | 模型插值,可以利用控制点进行插值
163 |
164 | ### 21.9 Motion Capture
165 |
166 | 
167 |
168 | 
169 |
170 | 运动捕捉的优劣
171 |
172 | 
173 |
174 | 为了让捕捉尽可能全面,遮挡少,可能需要大量摄像机并配合图像识别
175 |
176 | 
177 |
178 | 面部动画的一大问题
179 |
180 | 
181 |
182 | 面部表情捕捉
183 |
184 | 
185 |
186 | 工业界动画制作流程
187 |
188 | ## 22.Animation
189 |
190 | ### 22.1 Single Particle Simulation
191 |
192 | 
193 |
194 | 模拟粒子在力场中的运动
195 |
196 | 
197 |
198 | 容易想到的方式是用微分方程
199 |
200 | 但微分方程往往难以求解析解
201 |
202 | 
203 |
204 | 于是通常需要用差分的方式去模拟,即欧拉方法
205 |
206 | 
207 |
208 | 但这样做往往类似三体问题,导致很大误差
209 |
210 | 
211 |
212 | 甚至是会导致模式上都非常偏离真实解的误差
213 |
214 | 
215 |
216 | 数值模拟求解导致的误差和不稳定性
217 |
218 | ### 22.2 Combating Instability
219 |
220 | 
221 |
222 | 一些提升欧拉方法稳定性的方法
223 |
224 | 
225 |
226 | 比如可以每次先用欧拉方法计算下一个位置,但并不直接用下一个位置,而是取当前和下一个位置的中点,用中点的力去计算最后用的下一个位置。
227 |
228 | 
229 |
230 | 另一种方式是类似泰勒展开一般,多利用一个二阶导项,以减小误差
231 |
232 | 
233 |
234 | 还有一种结合了前面方法的方法,可以设置误差阈值,每次先取中点计算,如果和直接计算的差异足够小则停止,否则继续砍半计算。
235 |
236 | 这种自适应性在计算和结果稳定性上获得了很好的平衡,效果比较好。
237 |
238 | 
239 |
240 | 还有一种隐式欧拉法。需要求解方程(往往用牛顿法)
241 |
242 | 
243 |
244 | 隐式欧拉方法的误差是 𝑂(ℎ2) 比较小
245 |
246 | 
247 |
248 | 荣格库塔方法族也是很有效的模拟方式,可以直接使用其迭代方程,方程的推导需要参考《数值分析》课程。
249 |
250 | 
251 |
252 | 最后一种不基于物理,直接基于位置的一些逻辑去模拟,是相对物理的简化方式,在某些场景下效果已经足够。
253 |
254 | 
255 |
256 | 刚体的模拟方式,需要考虑位置、朝向、速度、角速度这几个量
257 |
258 | ### 22.3 Fluid Simulation
259 |
260 | 
261 |
262 | 水体基于位置的一种模拟方法。
263 |
264 | 将水的性质进行一些假设,比如水不可压缩,体积不变。
265 |
266 | 如果某块区域的的水的密度出现相对于静态时的变化,则做相反的调整。
267 |
268 | 
269 |
270 | 两种对待大量颗粒的方式:
271 |
272 | 1. 拉格朗日法:把每个质点看作独立个体,定义性质,进行模拟
273 | 2. 欧拉法:把质点们当作整体,考虑各区域的性质,进行模拟
274 |
275 | 
276 |
277 | 拉格朗日和欧拉法也可以结合起来应用
278 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/10-12~Geometry.md:
--------------------------------------------------------------------------------
1 | ## 10.Geometry:Introduction
2 |
3 | 由于图形学表现的对象,总需要用几何方法表示或者记录以及检索。所以相关几何知识是必要的。
4 |
5 | 
6 |
7 | 一个复杂的描述对象的例子
8 |
9 | 
10 |
11 | 几何的隐式表示:
12 |
13 | 1. 方便查询和检查
14 | 2. 不方便遍历
15 |
16 | 
17 |
18 | 几何的显式表示
19 |
20 | 1. 方便遍历、采样
21 | 2. 不方便查询
22 |
23 | 
24 |
25 | 
26 |
27 | 通过布尔运算组合出复杂形状
28 |
29 | 
30 |
31 | 通过距离函数定义几何表面
32 |
33 | 
34 |
35 | 距离函数的定义方法
36 |
37 | 
38 |
39 | 用距离函数进行组合粘连
40 |
41 | 
42 |
43 | 水平集隐式描述
44 |
45 | 
46 |
47 | 用水平集存储医学数据
48 |
49 | 
50 |
51 | 利用水平集进行物理模拟
52 |
53 | 
54 |
55 | 分型
56 |
57 | 
58 |
59 | 隐式表示的优劣
60 |
61 | ## 11.Geometry:Curves and surface
62 |
63 | ### 11.1 简介
64 |
65 | 
66 |
67 | 通过 Mesh 定义表面
68 |
69 | 
70 |
71 | 用点云定义物体
72 |
73 | 
74 |
75 | 常用的 Mesh 文件格式 .obj
76 |
77 | 例子中定义了一个正立方体
78 |
79 | - v 是其各个顶点的坐标
80 | - vn 是其各个面的法线方向(理应只有 6 个面,但由于计算机生成时的精度问题,偶尔会多生成一些)
81 | - vt 记录一些纹理坐标
82 | - f 记录三角形关系,其格式为:
83 | - 第一个顶点的顶点序号/第一个顶点的法线序号/第一个顶点的纹理坐标序号[空格]第二个顶点的顶点序号/…
84 |
85 | 
86 |
87 | 而对于线条,还可能会在动画运动中有用处
88 |
89 | 
90 |
91 | 也在矢量图中有应用
92 |
93 | ### 11.2 贝塞尔曲线
94 |
95 | 
96 |
97 | 贝塞尔曲线的定义:
98 |
99 | 1. 会经过起点后终点两个控制点
100 | 2. 起点的速度和起点与第二个点的连线同向,大小成正比
101 | 3. 终点的速度和倒数第二个点与终点的连线同向,大小成正比
102 |
103 | 
104 |
105 | 二次(三个控制点)贝塞尔曲线的一种显式画法
106 |
107 | 
108 |
109 | 三次(四个控制点)贝塞尔曲线的一种显式画法
110 |
111 | 
112 |
113 | 任意次的贝塞尔曲线画法
114 |
115 | 
116 |
117 | 贝塞尔曲线的一些性质,特别是有包围盒性质:曲线一定位于控制点所在的凸多边形内
118 |
119 | 
120 |
121 | 多个贝塞尔曲线相连
122 |
123 | 
124 |
125 | 𝐶1 连续,即函数连续、且导数连续
126 |
127 | 
128 |
129 | 其他类型的线条:Spline,会通过控制点且固定阶导数连续
130 |
131 | 
132 |
133 | B 样条
134 |
135 | ### 11.3 贝塞尔曲面
136 |
137 | 
138 |
139 | 
140 |
141 | 
142 |
143 | 相当于对点阵,基于行(或列)先计算一个方向的贝塞尔曲线,再基于计算出的几条曲线从列(或行)再计算一个贝塞尔曲线。
144 |
145 | 两次即可得到一个贝塞尔平面。
146 |
147 | 
148 |
149 | 具体的 16 个点的贝塞尔曲线插值计算方式。
150 |
151 | ## 12.Geometry:Others
152 |
153 | 
154 |
155 | 介绍自动升降面数和正规化模型的算法
156 |
157 | ### 12.1 Subdivision
158 |
159 | 
160 |
161 | LOOP(名称,不是循环的意思)细分的方法。
162 |
163 | 简单而言分为两步:
164 |
165 | 1. 创建更多的三角形
166 | 2. 调整三角形的顶点位置
167 |
168 | 
169 |
170 | 首先基于每个三角形的边中点,将任一三角形细分为四个。
171 |
172 | 但仅仅细分三角形是不会在视觉上产生差异的。
173 |
174 | 需要再调整各个顶点的位置。
175 |
176 | 对新的顶点和老的顶点的位置更新算法略有不同。
177 |
178 | 
179 |
180 | 新顶点的调整算法
181 |
182 | 
183 |
184 | 老顶点的调整算法。看起来会相对复杂一些,但核心思路就是基于自己和与自己相临的其他老顶点的高度进行加权平均。
185 |
186 | 
187 |
188 | 最后达到如上图的细分效果
189 |
190 | 
191 |
192 | Catmull-Clark 细分,是与 LOOP 细分不同的另一种细分方法。
193 |
194 | 其主要针对于不全是由三角形构成的 Mesh。
195 |
196 | 考虑四边形为正常的几何结构。四边形细分非常容易,取中点连线再加权即可。
197 |
198 | 主要问题是处理三角形结构。
199 |
200 | 三角形一定会成对出现,有三角形存在的地方一定存在两个度非 4 的顶点。
201 |
202 | 将顶点根据其度区别为正常顶点和奇异顶点(度非 4 的顶点),奇异顶点一定会成对出现,其连线会将一个四边形划分为两个三角形,此时为这两个三角形每个补充一个顶点(补充的也将是奇异顶点)。
203 |
204 | 
205 |
206 | 并如图连接,达到细分的效果。
207 |
208 | 且可以发现,细分之后全部都是四边形,不再存在三角形。但奇异点会继续保持为奇异点。
209 |
210 | 
211 |
212 | 还可以进一步细分下去
213 |
214 | 
215 |
216 | 其顶点的更新算法。
217 |
218 | 
219 |
220 | 两种算法的效果
221 |
222 | ### 12.2 Mesh Simplification
223 |
224 | 
225 |
226 | 区别于细分,Mesh 简化也是常见的需求。
227 |
228 | 特别对于游戏,实时渲染需要控制场景的总面数,一种合理的策略是让较远的物体面数偏低,近处的物体面数偏高。
229 |
230 | 为进一步提升实时性,通常需要同时保存多级模型,即 LOD。分级的过程能自动化则远比手动调整效率高。
231 |
232 | 
233 |
234 | 为达到这个目的,边坍缩是一种容易想到的方式。即把相邻的两个点压缩到一起
235 |
236 | 但实际操作中这个方法并不容易,因为其面临一些隐藏问题:
237 |
238 | 1. 坍缩哪些边?理应优先坍缩不重要的边,但哪些边是不重要的呢?
239 | 2. 坍缩后的顶点位置也不应该是平均值位置,如图而言讲道理需要高一些,但如何描述呢?
240 |
241 | 
242 |
243 | 度量贡献度和寻找最小误差的一个方法是二次误差度量法。
244 |
245 | 核心思路非常类似于线性回归的误差度量。
246 |
247 | 
248 |
249 | 基于二次误差度量,就可以寻找坍缩代价最小的边,用代价最小的坍缩方式进行坍缩。
250 |
251 | 
252 |
253 | 基于二次误差度量进行简化的效果
254 |
255 | ### 12.3 Shadow Mapping
256 |
257 | 
258 |
259 | 光栅化由于其局部性问题,想直接实现阴影效果是不行的,需要一些额外的方法。
260 |
261 | Shadow Mapping 就是这样的一种普遍的处理方式。不过 Shadow Mapping 只能处理点光源的问题,但对一般的游戏而言通常是足够的。
262 |
263 | 核心思路是:阴影是那些能直达摄像机,但不能直达光源的像素点。
264 |
265 | 
266 |
267 | 因此,可以首先将摄像机放在光源位置,看看哪些点能被光源直接照亮。
268 |
269 | 但记录哪些点可以被照亮是一件很难的事情,因为点是可以无限稠密的。
270 |
271 | 所以一种方式是进行一次深度图渲染。用于保存光源看到的深度信息。
272 |
273 | 
274 |
275 | 接着,再从眼睛的位置看向场景,渲染每个像素时,计算其在之前光源的深度图中的像素位置,并对比眼睛看到的点的光源深度和之前记录的光源深度。
276 |
277 | 如果两者深度一致则意味着这个点可以被光源照亮,否则不能被光源照亮。
278 |
279 | 
280 |
281 | 一个场景的例子
282 |
283 | 
284 |
285 | Shadow Mapping 之后的阴影对应的深度图映射在眼睛视角上的效果。
286 |
287 | 
288 |
289 | 
290 |
291 | 使用 Shadow Mapping 的游戏
292 |
293 | 
294 |
295 | 但由于 Shadow Mapping 只能处理点光源。于是只能得到硬阴影。而现实世界的光源往往是面光源,因而通常是软阴影,这使 Shadow Mapping 一定程度上不够真实。
296 |
297 | 要处理这个问题则需要光追算法。
298 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/07-09~Shading, Pipeline and Texture Mapping.md:
--------------------------------------------------------------------------------
1 | # Shading: Shading,Pipeline and Texture Mapping
2 |
3 | # 7.1 目前的进度和局限
4 |
5 | 
6 |
7 | 能够用上面的方法绘制场景,即可做出如图的效果。但这样是不够的。我们想得到下面的效果
8 |
9 | 
10 |
11 | 为什么会这样呢?为什么“相同”颜色的方块的每一面颜色不一致呢?容易发现,是环境光的影响。我们看到的物体画面是由物体本身和环境光共同作用得到的结果。所以需要考虑环境光。这个共同作用的方式,则体现出了物体的材质。
12 |
13 | # 7.2 Shading 是什么
14 |
15 | 
16 |
17 | 而 Shading 在本课中则对应着将材质应用于物体本身的过程。
18 |
19 | # 7.3 Blinn-Phong 模型介绍
20 |
21 | 
22 |
23 | Blinn-Phong 是经验总结下的容易实现的材质模型。其原理来自于观察:当光源和观察者的方向接近时,物体的颜色会变得更亮。而当光源和观察者的方向相反时,物体的颜色会变得更暗。
24 |
25 | 
26 |
27 | 类似于绘画中的三大面。可以把物体表面分为高光区域、漫反射区域、环境光区域。
28 |
29 | 
30 |
31 | 需要注意的是,Shading 有局部性,只关心每个三角形本身,不关心三角形相互的作用,
32 |
33 | # 7.4 Blinn-Phong 漫反射
34 |
35 | 
36 |
37 | Blinn-Phong 模型中,漫反射的颜色受到三个部分影响
38 |
39 | - 材料的固有色,对应一个系数(可为颜色向量)$k_d$
40 | - 反光点和光源的距离光源,距离越远亮度越底,对应于 $𝐼/𝑟^2$
41 | - 表面法线与光线的夹角,夹角越大则单位面积能反射的光子理应越少,一旦大过 $𝜋/2$ 则意味着背光,不再漫反射。于是对应于 $𝑚𝑎𝑥(0,𝑛∗𝑙)$
42 |
43 | 
44 |
45 | 仅利用漫反射模型,且单一灰阶的固有色即可渲染出上面的效果。
46 |
47 | # 8.1 Blinn-Phong 高光
48 |
49 | 
50 |
51 | 再考虑高光项。高光对应于镜面反射,摄像机越接近光源的镜面反射的出方向,则应接受到越强的镜面反射光。度量这个“接近度”有一个聪明的比较容易的计算的方法,是比较光源方向和摄像机方向的中间方向(很容易计算)和法线方向的夹角,夹角越大则越不接近。
52 |
53 | 且对于这个接近度可以取一个次数 $p$,使整体更容易调整,且接近想要的效果。
54 |
55 | 
56 |
57 | $p$ 越高,高亮区域越小。通常而言会用到 100 ~ 200。
58 |
59 | 
60 |
61 | 加入了高光项后,可以得到上图效果,且可以看出两个参数在调整时对结果的影响。
62 |
63 | # 8.2 Blinn-Phong 环境光
64 |
65 | 
66 |
67 | 最后,对于暗部,并不希望全黑,所以可以加入环境光项,当然,并没有办法保证有光,也不可能环境光处处相同,所以这只是个不符合物理的趋近方法
68 |
69 | 
70 |
71 | 最后综合 漫反射、高光、环境光 三项后可以得到上图效果。
72 |
73 | # 8.3 Shading 频率
74 |
75 | 
76 |
77 | 同样是应用 Blinn-Phong,也可以由于面向对象不同得到不同结果,上方三张图依次对应于
78 |
79 | - 低频:面向三角形
80 | - 中频:面向顶点,三角形内部应用重心坐标差值
81 | - 高频:面向像素
82 |
83 | 
84 |
85 | 面向三角形的 Shading 计算量最小。但对于不够高面又光滑曲面的物体而言会不再光滑。
86 |
87 | 
88 |
89 | 对顶点着色,并应用差值:
90 |
91 | 
92 |
93 | 对每个像素着色。这里的 Phong Shading 对应于着色频率,而非 Blinn-Phong 着色模型。
94 |
95 | 
96 |
97 | 这几种着色频率对应足够高面的模型而言表现是近似的。所以如果足够多面,应优先选择更低频的着色方式,减少计算量。
98 |
99 | 
100 |
101 | 对逐顶点着色而言,是需要获得顶点的法线的。可以采用相邻三角形法线的简单平均,或者根据三角形面积加权平均。
102 |
103 | 
104 |
105 | 对逐像素着色而言,则需要获得每个像素的法线方向,通常使用自己和附近面的法线用一些方式加权平均。
106 |
107 | # 8.4 渲染管线
108 |
109 | 
110 |
111 | 将一次渲染分成几步,大部分集成在 GPU 内部,成为硬件逻辑。部分可以编程。
112 |
113 | 
114 |
115 | 比如一开始先处理顶点(等效于处理三角形,因为三角形被顶点决定)
116 |
117 | 
118 |
119 | 
120 |
121 | 对片面的测试和处理(也可以算作光栅化的一部分)
122 |
123 | 
124 |
125 | Shading 根据不同着色频率可以对应至这两个步骤。
126 |
127 | 
128 |
129 | 纹理映射也属于 Shading 一部分:
130 |
131 | 
132 |
133 | 纯靠 Shader 代码 800 行绘制出蜗牛。
134 |
135 | # 8.5 纹理映射
136 |
137 | 
138 |
139 | 将二维的表面和一张二维的图逐点一一对应:
140 |
141 | 
142 |
143 | 一些纹理是可以上下左右拼接的,做到重复利用。
144 |
145 | # 9.1 三角形重心坐标
146 |
147 | 
148 |
149 | 
150 |
151 | 用对面三角形面积占比计算:
152 |
153 | 
154 |
155 | # 9.2 应用纹理
156 |
157 | 
158 |
159 | 直接采样,又会有锯齿问题。可以通过双线性插值(Bilinear)一定程度解决。当然还可以用 Bicubic 三阶差值(取周围 16 个点),得到更好的效果:
160 |
161 | 
162 |
163 | 双线性插值的方法:
164 |
165 | 
166 |
167 | 当纹理过大也会有问题,问题源自一个像素对应了纹理上太多像素:
168 |
169 | 
170 |
171 | 
172 |
173 | 超采样可以解决,但计算量过大:
174 |
175 | 
176 |
177 | Mipmap 是一种对贴图进行预处理后很好的一种方式:
178 |
179 | 
180 |
181 | 使用 Mipmap 的情况下,如果直接为每个像素点指定一个层级,会让过渡比较硬。
182 |
183 | 
184 |
185 | 可以用相邻两个层级进行线性插值:
186 |
187 | 
188 |
189 | 得到更好的结果:
190 |
191 | 
192 |
193 | 不过 Mipmap 依旧不能解决这个问题:
194 |
195 | 
196 |
197 | 这是由于 Mipmap 擅长解决正方形的采样,但不擅长非正方形的采样:
198 |
199 | 
200 |
201 | 所以后来还有 Ripmaps 可以支持任意正放的长方形采样,还有 EWA 更加复杂,但可以支持把任意形状分成多个圆形。但也意味着多次查询需要的更多开销。
202 |
203 | # 10.1 贴图的其他应用
204 |
205 | 
206 |
207 | 记录环境光
208 |
209 | 
210 |
211 | 环境光可以记录在球上,但球的两极会有扭曲,所以一般记录在正方体的表面
212 |
213 | 
214 |
215 | 还可以记录表面相对高度,即凹凸贴图(与法线贴图目标近似,但计算和优势不同)
216 |
217 | 
218 |
219 | 二维上计算法线的方式是查分求导再旋转。
220 |
221 | 
222 |
223 | 三维也类似
224 |
225 | 
226 |
227 | 还可以在处理顶点时事实地改变顶点位置。
228 |
229 | 不过这要求模型的精细度足够高,以保证有足够多的顶点可以随贴图改变。目前 Direct X 支持这种情况下动态改变模型的精细度。
230 |
231 | 
232 |
233 | 纹理也可以是 3D 的,甚至是函数化的
234 |
235 | 
236 |
237 | 还可以用于预烘培,提前计算一些阴影啥的
238 |
239 | 
240 |
241 | 或者记录三维信息
242 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/13-15~Ray Tracing.md:
--------------------------------------------------------------------------------
1 | ## 13.Ray Tracing 1
2 |
3 | ### 13.1 Ray Tracing Introduction
4 |
5 | 
6 |
7 | 使用光线追踪目的自然是为了解决光栅化做得还不够好的一些问题。
8 |
9 | 由于光栅化的算法原理,有很多表现上的限制,比如:
10 |
11 | 1. 无法表现真实的软阴影
12 | 2. 无法表现毛玻璃等粗糙的反射效果
13 | 3. 无法表现非直接光照(只能用全局光照代替)
14 |
15 | 
16 |
17 | 所以对比起来,光栅化快,但是效果差。
18 |
19 | 
20 |
21 | 而光线追踪速度慢,但是效果好
22 |
23 | ### 13.2 Basic Ray Tracing Algorithm
24 |
25 | 
26 |
27 | 对光线有一些基本性质的假设(和真实光仍略有区别)。
28 |
29 | 
30 |
31 | 曾经很多人以为眼睛能看到东西,是类似于蝙蝠一般,由眼睛发射出“感知光线”,并且此理论被很多名人或哲学家支持。
32 |
33 | 现在来看,这种理论虽然有问题,但基于图形学中的“光路可逆性”而言,为了效率,渲染时采取的方法正是从摄像机发出“感知光线”进行渲染。
34 |
35 | 
36 |
37 | Ray Casting 方式就是从摄像机,沿每个像素发射出感知光线,并考虑其是否能被光源照亮,可以的话则计算着色。
38 |
39 | 
40 |
41 | 对于一个场景而言,则需要找“感知光线”达到的第一个面
42 |
43 | ### 13.3 Whitted-Style Ray Tracing
44 |
45 | 
46 |
47 | 将光线进行多次的弹射或折射。即是 Whitted 光线追踪。
48 |
49 | 
50 |
51 | 每次弹射或者折射出新光线后,当新光线碰撞到某个面之后,再基于光源进行着色,并考虑损耗,最后加和到最初的像素点。
52 |
53 | 总之就是在模拟光线传播的过程。
54 |
55 | 但这个过程理解容易,但在实现时会有不少技术问题,下面依次结果
56 |
57 | ### 13.4 Ray-Surface Intersection
58 |
59 | 
60 |
61 | 首先定义光线为一根射线
62 |
63 | 
64 |
65 | 相交意味着两个方程有解
66 |
67 | 
68 |
69 | 射线和球的交点是比较好求的
70 |
71 | 
72 |
73 | 进一步推广到射线和其他表面的交点。求解通常用数值的方式,不需要把表达式求出来即可得到数值结果。
74 |
75 | 
76 |
77 | 如果对于一个 Mesh 物体,则需要判断光线与各个三角形的交点。
78 |
79 | 这又有两个明显的问题:
80 |
81 | 1. 如何求射线与三角形的交点
82 | 2. 一个场景,甚至一个 Mesh 都可能有非常多的三角形,每次光线折射都需要全部求一次计算量过大,如何优化
83 |
84 | 首先,对于第一个问题,可以进一步分解成两步:
85 |
86 | 1. 求射线与三角形所在平面的交点
87 | 2. 判断交点是否在三角形内部
88 |
89 | 第二个问题则主要诉诸数据结构中的搜索树,以优化查询复杂度,详见后文
90 |
91 | 
92 |
93 | 先求射线与三角形平面的交点,再求交点的重心坐标,根据坐标的正负性判断在三角形内或外,这是常用的思路。
94 |
95 | 而 Moller Trumbore 是一种简化后可快速求射线与三角形所在平面交点的重心坐标的方法
96 |
97 | ### 13.4 Accelerating Ray-Surface Intersection
98 |
99 | 
100 |
101 | 有些场景的面数非常高,每次都求光线与每个面的交点导致的计算量会非常恐怖。
102 |
103 | 
104 |
105 | 一种加速方式是给每个物体加上包围盒。
106 |
107 | 碰撞判断时首先判断是否和包围盒碰撞,如果有碰撞再检测和其中的三角形是否碰撞。
108 |
109 | 这样可以使没碰撞到包围盒的物体的检测次数降低至一次。
110 |
111 | 
112 |
113 | 包围盒的碰撞检测方式是求射线与三组平行平面的交点
114 |
115 | 
116 |
117 | 对每个平面求得与射线的交点之后进行裁剪(即取解集的交集),以获得最终结果。
118 |
119 | 如果裁剪之后没有位于包围盒以内的线段则意味着不相交。
120 |
121 | 
122 |
123 | 当射线与与三组平行平面都有相交时,则与包围盒相交。
124 |
125 | 
126 |
127 | 由于是求射线与平面的交点而不是直线与平面,所以需要考虑解的符号,进行特殊判断。
128 |
129 | 
130 |
131 | 之所以尽可能使用与坐标轴对齐的包围盒主要是为了节省计算量。
132 |
133 | ## 14.Ray Tracing 2
134 |
135 | ### 14.1 Uniform Spatial Partition(Grids)
136 |
137 | 
138 |
139 | 对空间进行均匀的网格划分,将物体注册到所占的空间中的格子。
140 |
141 | 
142 |
143 | 探测时仅检测光线与当前所在格子的物体是否有碰撞即可,减少检测总量。
144 |
145 | 
146 |
147 | 格子过密或者过梳都可能出现问题:
148 |
149 | 1. 过密导致检测总量依旧偏多,需要花费大量计算于格子的定位和检测
150 | 2. 过梳则导致一个格子包含太多物体,可能和不划分格子没有差异
151 |
152 | 所以一个经验公式是:格子的数量=27\*物体数量
153 |
154 | 
155 |
156 | 网格优化方式对于物体较小且分布较均匀的场景比较有效。
157 |
158 | 
159 |
160 | 但对于物体大小差异很大的场景则优化效率非常有限,甚至反而增加计算总量
161 |
162 | ### 14.2 Spatial Partitions(Trees)
163 |
164 | 于是另一种方式是非均匀的空间划分
165 |
166 | 
167 |
168 | 对此也有几种划分方式,本质都是构建搜索树:
169 |
170 | 1. 八叉树对空间均匀划分,且在某种条件下停止划分(比如格子里的物体小于等于 1 个)
171 | - 缺点是在一些应用中需要对高维空间进行划分,会导致每次划分出 2𝑛 个子节点,略爆炸,所以一般不倾向于用八叉树。
172 | 2. KD-Tree 对空间进行动态的二分划分
173 | - 每次轮流沿 xy、yz、zx 平面(可以相对均匀)对空间进行一次划分,不需要均分。整个结构类似于二叉树。且可以通过算法找比较好的划分位置,使物体尽可能少地跨越多个格子
174 | 3. BSP-Tree 类似 KD-Tree 的二分方法,但允许不延轴向平面。
175 |
176 | 在图形学中 BSP-Tree 会导致判断时计算量相对于 KD-Tree 更高(前面的 AABB 判断),所以一般更倾向于使用 KD-Tree。
177 |
178 | 
179 |
180 | KD-Tree 的处理即不断循环找一个轴向平面对空间进行划分。得到一个二叉树。
181 |
182 | 
183 |
184 | 其数据结构如上
185 |
186 | 
187 |
188 | 碰撞检测时,用类似 AABB 的方式不断求交定位节点,如果有子节点则进一步求交即可。
189 |
190 | 
191 |
192 | 最后找到叶子节点中的物体进行相交判断,得到最终结果。
193 |
194 | ### 14.3 Object Partition:Bounding Volume Hierarchy
195 |
196 | 
197 |
198 | 对三角形集的包围盒进行对象划分,每次也划分出两块,得到一棵二叉树。
199 |
200 | 
201 |
202 | 对一个节点进行多次划分的情况
203 |
204 | 
205 |
206 | 划分的过程总结
207 |
208 | 
209 |
210 | 每次划分的一些原则
211 |
212 | 
213 |
214 | BVH 的数据结构
215 |
216 | 
217 |
218 | 对空间划分和对对象两种方式性质的比较
219 |
220 | ### 14.4 Radiometry:Motivation
221 |
222 | 
223 |
224 | 如果想使渲染效果尽可能地符合现实世界。
225 |
226 | 则需要研究现实世界的光的性质和传播原理。
227 |
228 | 也由此需要学习辐射度量学。
229 |
230 | ### 14.5 Radiometry:Energy and Flux
231 |
232 | 
233 |
234 | Radiant 是辐射能量
235 |
236 | Radiant Flux 是辐射强度,单位为瓦特。
237 |
238 | 
239 |
240 | Radiant Flux 也可以理解为单位时间通过单位平面的光子数量。
241 |
242 | 
243 |
244 | 三种复合的光线度量:
245 |
246 | 1. Radiant Intensity:一个光源的辐射强度(单位 坎德拉 Candela 或 流明/单位角)
247 | - 度量某角度上的 Radiant Intensity 有一个单位是 流明=坎德拉\*球面度。
248 | 2. Irradiance:一个点接受的辐射强度(单位:流明/平方米)
249 | 3. Radiance:一根线上的辐射强度(单位:nit 或 流明/单位角/平方米)
250 |
251 | ### 14.6 Radiometry:Radiant Intensity
252 |
253 | 
254 |
255 | 
256 |
257 | 立体角的定义或计算方式。(这也可以看出弧度相对于角度的好处:可以容易地往高维推广)
258 |
259 | 
260 |
261 | 立体角的微元,即球面的微元
262 |
263 | 
264 |
265 | 完整空间的立体角即单位球的表面积 4𝜋
266 |
267 | 
268 |
269 | 因此对于一个各向同性的点光源而言:
270 |
271 | Radiant Flux=Radiant Intensity \* 4𝜋
272 |
273 | 或者 Radiant Intensity = Radiant Flux / 4𝜋
274 |
275 | 
276 |
277 | 而 Radiant Flux 对应度量单位 Lumen(流明)。由此可知一个 815 流明的灯,如果向各个方向辐射的强度一致,其 Radiant Intensity 即 65 坎德拉。
278 |
279 | ### 15.1 Radiometry:Irradiance
280 |
281 | 
282 |
283 | Irradiance 即辐射强度在面积上的强度
284 |
285 | 
286 |
287 | 基于此可以容易知道在光栅化的 Lambert 渲染方式中 cos 的物理意义。
288 |
289 | 
290 |
291 | 同时一个杂知识:春夏秋冬温度变换不是由于地球公转离太阳远近,而是由于地球自转轴相对于黄道平面的偏角导致南北半球随公转接受的 Irradiance 也跟着变化,进而有了春夏秋冬。
292 |
293 | 
294 |
295 | Irradiance 是会随着距离平方反比进行衰减的(即使不考虑介质吸收的能量)
296 |
297 | ### 15.2 Radiance
298 |
299 | 
300 |
301 | Radiance 是描述光线在环境中传播最基础的量。
302 |
303 | 渲染基本上就是在计算 Radiance
304 |
305 | 
306 |
307 | Radiance 是 Radiant Intensity 在面积上的微分
308 |
309 | Radiance 也是 Irradiance Intensity 在球面角上的微分
310 |
311 | 其单位为 nit
312 |
313 | 
314 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/19-20~Cameras, Lenses and Light Fields.md:
--------------------------------------------------------------------------------
1 | ## 19.Cameras,Lenses and Light Fields
2 |
3 | ### 19.1 Camera
4 |
5 | 
6 |
7 | 相机或眼睛用类似凸透镜的成像本质和小孔类似,但相比于小孔成像,透镜能聚焦更多光子
8 |
9 | 
10 |
11 | 相机的感光元件记录的是 Irradiance,因此必须要有小孔或者透镜,否则会直接糊掉
12 |
13 | 
14 |
15 | 小孔成像虽然光子少但是效果也不一定差
16 |
17 | ### 19.2 Field of View
18 |
19 | 
20 |
21 | 同样大小的感光片情况下,焦距越小,视角越大
22 |
23 | 同样的焦距下,感光片越大视角越大
24 |
25 | 
26 |
27 | 相机焦距和视角的关系(且统一使用 36\*24mm 的底片为计算标准,非标准底片需要相应折算)
28 |
29 | 
30 |
31 | 这是调焦距可以调整画面“远近”的原因,但并非真实的“远近”,和把相机放近后拍照得到的透视关系有区别
32 |
33 | 
34 |
35 | 感光器的大小区别
36 |
37 | 
38 |
39 | ### 19.3 Exposure
40 |
41 | 
42 |
43 | 显然,每个感光元件在一次曝光情况下接受的能量=时间\*irradiance
44 |
45 | 
46 |
47 | 通常有三种方式可以调整曝光度:光圈大小、快门速度、ISO
48 |
49 | 
50 |
51 | 用这三种方式调整会有各自的特征和利弊
52 |
53 | 
54 |
55 | ISO 由于是直接对数据进行放大,自然也会放大噪声。所以通常不倾向采用这种调整方式
56 |
57 | 
58 |
59 | 调整光圈大小,且通常用 FN 来表示,其中 N 和光圈直径呈反比
60 |
61 | 调整光圈还会影响景深效果:光圈越小精深效果越弱。恰如近视眼虚眼看东西会清晰一些的原理
62 |
63 | 
64 |
65 | 快门速度可能导致运动模糊
66 |
67 | 
68 |
69 | 但运动模糊并不一定不好,很多时候反而是有更好,比如电影和游戏
70 |
71 | 
72 |
73 | 快门由于是机械式,开关有一个过程,所以拍摄高速物体时可能产生畸变
74 |
75 | 
76 |
77 | 为达到相同的曝光度,在不调整 ISO 的情况下需要相反地调整快门速度和光圈
78 |
79 | 所以可能要么牺牲一些景深,要么产生一些运动模糊,需要在这两者间根据照片目标效果进行平衡取舍
80 |
81 | ### 19.4 Fast and Slow Photography
82 |
83 | 
84 |
85 | 极高的快门速度,于是一般需要配合极大的光圈或者高 ISO
86 |
87 | 
88 |
89 | 长曝光效果
90 |
91 | ### 19.5 Thin Lens Approximation
92 |
93 | 
94 |
95 | 在实际工业界,由于很多场景下空间不可能达到焦距要求的长度,通常使用多个镜片组合模拟出单凸透镜的效果。
96 |
97 | 
98 |
99 | 事实上很多情况下镜片聚焦也不在一个点上
100 |
101 | 
102 |
103 | 但我们通常只考虑最理想的透镜
104 |
105 | ### 19.6 Defocus Blur
106 |
107 | 
108 |
109 | 失焦模糊的原理。并由此产生景深
110 |
111 | 
112 |
113 | 
114 |
115 | 光圈大小对于景深的影响
116 |
117 | ### 19.7 Ray Tracing Ideal Thin Lenses
118 |
119 | 
120 |
121 | 由此在渲染中也可以根据这样的性质,主动建模出一个透镜和感光片(用以代替普通光线追踪的小孔成像模型)
122 |
123 | 
124 |
125 | 并渲染出带景深效果的渲染图
126 |
127 | 
128 |
129 | 由于实际的相机是有像素是离散的,可以如上考虑一个像素大小的景深模糊情况。
130 |
131 | ## 20.Color and Perception
132 |
133 | ### 20.1 Light Field
134 |
135 | 
136 |
137 | 我们看到场景是因为场景有光发射向我们的眼睛
138 |
139 | 
140 |
141 | 但如果一个屏幕能够模拟屏幕后方所有光矢,则理应让我们无法分辨真假,真裸眼 3D
142 |
143 | 
144 |
145 | 记录一个点在一个时刻的广场,需要三个参数:
146 |
147 | 1. 两维记录视角
148 | 2. 一维记录波长
149 |
150 | 最后用函数记录这个视角下这个波长的光的能量
151 |
152 | 
153 |
154 | 如果要记录全时全局的广场,则需要额外再增加一维时间,和三维坐标,一共七维进行记录
155 |
156 | 
157 |
158 | 有了它我们可以重建任意画面
159 |
160 | 
161 |
162 | 如果对于一个有限的区域,则只需要一个盒子,和盒子上每一点的光场信息即可复刻
163 |
164 | 
165 |
166 | 为此一种痛常的做法是用两个平面,记录单平面光场,不考虑时间和光波长的话,刚好是 4 维
167 |
168 | 
169 |
170 | 这是一个光场采样的实例
171 |
172 | 
173 |
174 | 斯坦福的光场采集阵列
175 |
176 | 
177 |
178 | 生物的复眼,本质也是一个光场相机
179 |
180 | ### 20.2 Light Field Camera
181 |
182 | 
183 |
184 | 已经商业化量产的光场相机
185 |
186 | 
187 |
188 | 光场相机的每个像素都是一个相机
189 |
190 | 
191 |
192 | 如果我们只想用光场相机拍一张普通照片,则统一取一个方向的光即可
193 |
194 | 
195 |
196 | 当然,光场相机如此牛逼的表现下,也是有极大的代价的
197 |
198 | ### 20.3 Physical Basis of Color
199 |
200 | 
201 |
202 | 可见光的光谱
203 |
204 | 
205 |
206 | 可以用谱功率密度记录一时刻一束光的性质
207 |
208 | 
209 |
210 | 
211 |
212 | 一些常见的光源的谱功率密度分布
213 |
214 | 
215 |
216 | 且光是可以线性组合的
217 |
218 | 
219 |
220 | 而颜色只是我们的感知,物理世界并不存在颜色的概念
221 |
222 | ### 20.4 Biological Basis of Color
223 |
224 | 
225 |
226 | 人眼中的视杆细胞和视锥细胞
227 |
228 | 
229 |
230 | 三种视锥细胞对光波频率的响应曲线
231 |
232 | 
233 |
234 | 很神奇的一点是事实上每个人眼中的三种细胞的分布差异极大
235 |
236 | 每个人看到世界的感觉极大可能并不相同
237 |
238 | 
239 |
240 | 视锥细胞响应光波的计算方式
241 |
242 | 
243 |
244 | 大脑视觉感知的数据就仅仅来自于这些细胞的有限的处理后的信息
245 |
246 | ### 20.5 Metamerism
247 |
248 | 
249 |
250 | 由于大脑接受到的是视细胞处理后的信号,相对于无穷维的光谱,大脑能接受的仅三维信号。所以是有信息缺失的。
251 |
252 | 比如大脑就无法分辨如图的几种广谱,看起来都是一种颜色
253 |
254 | 
255 |
256 | 也是因为这样,显示器调色也只是调出感觉上较一致的光谱,而远非实际的光谱。
257 |
258 | ### 20.6 Color Reproduction or Matching
259 |
260 | 
261 |
262 | 找实验人员来混合 RGB 使其和单光源的光看起来接近
263 |
264 | 
265 |
266 | 但有的时候,靠 RGB 加和,是达不到目标光源的效果的,有可能需要对光源进行补光
267 |
268 | 这是则会导致 RGB 中产生负值分量
269 |
270 | 
271 |
272 | 负值分量在单色光谱谱配中,红色是比较明显的
273 |
274 | 
275 |
276 | 所以,在 CIE 颜色匹配系统中,采用的是这样的匹配方式
277 |
278 | ### 20.7 Color Spaces
279 |
280 | 
281 |
282 | 我们通常常用的颜色空间 sRGB
283 |
284 | 
285 |
286 | 科学界常用的人造颜色空间 CIE XYZ
287 |
288 | 
289 |
290 | 将 XYZ 归一化后可以减少一维,展示出其实际颜色空间
291 |
292 | 单一波长光对应的坐标分布在边沿(但粉红边不对应自然中的单波光)
293 |
294 | 
295 |
296 | 其他一些系统的色域则位于中间的一部分
297 |
298 | 
299 |
300 | HSV 颜色空间,由于比较直观,在美术工作中比较常用
301 |
302 | 
303 |
304 | CIELAB 颜色空间,用三组互补色确立三维颜色空间
305 |
306 | 
307 |
308 | 颜色是相对的,是感知的实例(视觉白平衡,和蓝金衣服是一个原理)
309 |
310 | 
311 |
312 | 打印用的减色颜色空间
313 |
314 | 理论上只用品红、蓝、黄即可,黑色可以由这三个颜色混合而成。但实际为了节省颜料费用,会单独使用黑色颜料(黑色颜料使用量大,且便宜)。
315 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2010~java-codes/Computational_Geometry_Orientation.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "Computational_Geometry:Orientation.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": [],
9 | "authorship_tag": "ABX9TyM0fy+oP9O2xIwPNGHLv8DT",
10 | "include_colab_link": true
11 | },
12 | "kernelspec": {
13 | "name": "python3",
14 | "display_name": "Python 3"
15 | }
16 | },
17 | "cells": [
18 | {
19 | "cell_type": "markdown",
20 | "metadata": {
21 | "id": "view-in-github",
22 | "colab_type": "text"
23 | },
24 | "source": [
25 | "
"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "metadata": {
31 | "id": "233oGzrptC5i",
32 | "colab_type": "code",
33 | "colab": {}
34 | },
35 | "source": [
36 | "# Input: A list of three points in 2-D space as [p1, p2, p3].\n",
37 | "# Output: Determine whether line segment p2p3 has a right (clockwise) or left (counter-clockwise) oriantation \n",
38 | "# with respect to line segment p1p2."
39 | ],
40 | "execution_count": 0,
41 | "outputs": []
42 | },
43 | {
44 | "cell_type": "code",
45 | "metadata": {
46 | "id": "UYJYVlLPtz8O",
47 | "colab_type": "code",
48 | "colab": {}
49 | },
50 | "source": [
51 | "import numpy as np\n",
52 | "import matplotlib.pyplot as plt\n",
53 | "%matplotlib inline"
54 | ],
55 | "execution_count": 0,
56 | "outputs": []
57 | },
58 | {
59 | "cell_type": "code",
60 | "metadata": {
61 | "id": "-Sd4CbFDt4mx",
62 | "colab_type": "code",
63 | "colab": {}
64 | },
65 | "source": [
66 | "def orientation(points):\n",
67 | " data = np.array(points)\n",
68 | " x, y = data.T\n",
69 | " plt.scatter(x, y)\n",
70 | " plt.show()\n",
71 | " o = (data[1][1] - data[0][1])*(data[2][0] - data[1][0]) - (data[2][1] - data[1][1])*(data[1][0] - data[0][0])\n",
72 | " if(o > 0):\n",
73 | " return \"Right turn (Clockwise)\"\n",
74 | " if(o < 0):\n",
75 | " return \"Left turn (Counter_Clockwise)\"\n",
76 | " if(o == 0):\n",
77 | " return \"Line\""
78 | ],
79 | "execution_count": 0,
80 | "outputs": []
81 | },
82 | {
83 | "cell_type": "code",
84 | "metadata": {
85 | "id": "V5wrMbZJubJ6",
86 | "colab_type": "code",
87 | "outputId": "f90fb727-50b3-40bb-8e69-8ff999c88066",
88 | "colab": {
89 | "base_uri": "https://localhost:8080/",
90 | "height": 282
91 | }
92 | },
93 | "source": [
94 | "input = [(0,3), (3,0), (2,2)]\n",
95 | "orientation(input)"
96 | ],
97 | "execution_count": 0,
98 | "outputs": [
99 | {
100 | "output_type": "display_data",
101 | "data": {
102 | "image/png": "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\n",
103 | "text/plain": [
104 | ""
105 | ]
106 | },
107 | "metadata": {
108 | "tags": [],
109 | "needs_background": "light"
110 | }
111 | },
112 | {
113 | "output_type": "execute_result",
114 | "data": {
115 | "text/plain": [
116 | "'Left turn (Counter_Clockwise)'"
117 | ]
118 | },
119 | "metadata": {
120 | "tags": []
121 | },
122 | "execution_count": 21
123 | }
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "metadata": {
129 | "id": "gGPLYBnsunwq",
130 | "colab_type": "code",
131 | "colab": {}
132 | },
133 | "source": [
134 | ""
135 | ],
136 | "execution_count": 0,
137 | "outputs": []
138 | }
139 | ]
140 | }
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2018~python-codes/Computational_Geometry_Orientation.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "Computational_Geometry:Orientation.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": [],
9 | "authorship_tag": "ABX9TyM0fy+oP9O2xIwPNGHLv8DT",
10 | "include_colab_link": true
11 | },
12 | "kernelspec": {
13 | "name": "python3",
14 | "display_name": "Python 3"
15 | }
16 | },
17 | "cells": [
18 | {
19 | "cell_type": "markdown",
20 | "metadata": {
21 | "id": "view-in-github",
22 | "colab_type": "text"
23 | },
24 | "source": [
25 | "
"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "metadata": {
31 | "id": "233oGzrptC5i",
32 | "colab_type": "code",
33 | "colab": {}
34 | },
35 | "source": [
36 | "# Input: A list of three points in 2-D space as [p1, p2, p3].\n",
37 | "# Output: Determine whether line segment p2p3 has a right (clockwise) or left (counter-clockwise) oriantation \n",
38 | "# with respect to line segment p1p2."
39 | ],
40 | "execution_count": 0,
41 | "outputs": []
42 | },
43 | {
44 | "cell_type": "code",
45 | "metadata": {
46 | "id": "UYJYVlLPtz8O",
47 | "colab_type": "code",
48 | "colab": {}
49 | },
50 | "source": [
51 | "import numpy as np\n",
52 | "import matplotlib.pyplot as plt\n",
53 | "%matplotlib inline"
54 | ],
55 | "execution_count": 0,
56 | "outputs": []
57 | },
58 | {
59 | "cell_type": "code",
60 | "metadata": {
61 | "id": "-Sd4CbFDt4mx",
62 | "colab_type": "code",
63 | "colab": {}
64 | },
65 | "source": [
66 | "def orientation(points):\n",
67 | " data = np.array(points)\n",
68 | " x, y = data.T\n",
69 | " plt.scatter(x, y)\n",
70 | " plt.show()\n",
71 | " o = (data[1][1] - data[0][1])*(data[2][0] - data[1][0]) - (data[2][1] - data[1][1])*(data[1][0] - data[0][0])\n",
72 | " if(o > 0):\n",
73 | " return \"Right turn (Clockwise)\"\n",
74 | " if(o < 0):\n",
75 | " return \"Left turn (Counter_Clockwise)\"\n",
76 | " if(o == 0):\n",
77 | " return \"Line\""
78 | ],
79 | "execution_count": 0,
80 | "outputs": []
81 | },
82 | {
83 | "cell_type": "code",
84 | "metadata": {
85 | "id": "V5wrMbZJubJ6",
86 | "colab_type": "code",
87 | "outputId": "f90fb727-50b3-40bb-8e69-8ff999c88066",
88 | "colab": {
89 | "base_uri": "https://localhost:8080/",
90 | "height": 282
91 | }
92 | },
93 | "source": [
94 | "input = [(0,3), (3,0), (2,2)]\n",
95 | "orientation(input)"
96 | ],
97 | "execution_count": 0,
98 | "outputs": [
99 | {
100 | "output_type": "display_data",
101 | "data": {
102 | "image/png": "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\n",
103 | "text/plain": [
104 | ""
105 | ]
106 | },
107 | "metadata": {
108 | "tags": [],
109 | "needs_background": "light"
110 | }
111 | },
112 | {
113 | "output_type": "execute_result",
114 | "data": {
115 | "text/plain": [
116 | "'Left turn (Counter_Clockwise)'"
117 | ]
118 | },
119 | "metadata": {
120 | "tags": []
121 | },
122 | "execution_count": 21
123 | }
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "metadata": {
129 | "id": "gGPLYBnsunwq",
130 | "colab_type": "code",
131 | "colab": {}
132 | },
133 | "source": [
134 | ""
135 | ],
136 | "execution_count": 0,
137 | "outputs": []
138 | }
139 | ]
140 | }
--------------------------------------------------------------------------------
/header.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/99~参考资料/1998~《Real-Time Rendering》/2018~《实时渲染(Real-Time Rendering)》~V4/Chapter 24 The Future 未来.md:
--------------------------------------------------------------------------------
1 | # Chapter 24 The Future 未来
2 |
3 | ## 目录
4 |
5 | - [24.1 其他事项](#241-其他事项)
6 | - [24.2 你](#242-你)
7 |
8 | > Billy Zelsnack——“Pretty soon, computers will be fast.”
9 |
10 | > 比利·泽尔纳克——“很快,计算机就会变得很快。”(引擎程序员,曾参与开发《雷神之锤》、《毁灭公爵》,其创建的游戏公司 Rebel Boat Rocker 与后来的 Gearbox Software 有关)
11 |
12 | > Niels Bohr or Yogi Berra——“Prediction is difficult, especially of the future.”
13 |
14 | > 尼尔斯·玻尔 or 尤吉·贝拉——“预测是困难的,尤其是预测未来。”(丹麦理论物理学家,哥本哈根学派创始人;1885—1962)(前 MLB 捕手、教练;Yogi 是少年友人起的外号,由于盘腿坐姿类似印度瑜伽士,1925—2015)
15 |
16 | > Alan Kay——“The best way to predict the future is to create it.”
17 |
18 | > 艾伦·凯——“预测未来的最好方法就是创造未来。”(美国计算机科技家,2003 年图灵奖得主;1940—)
19 |
20 | 在这个展望未来的章节中,由两部分组成:其他事项和你。这一章就是关于这两方面的内容。首先,我们将会做出一些预测,其中的一些预测甚至可能会成为现实。更重要的是第二部分,关于下一步你可以前往哪里。你可以将本章节视为一个扩展的“补充阅读和资源”,就像是之前每章末尾的那样;但是我们也对从这里开始的方法进行了讨论,包括一般的信息来源、会议、代码等。首先我们先来看一个图片,如图 24.1 所示。
21 |
22 | 
23 |
24 | ## 24.1 其他事项
25 |
26 | 图形学有助于游戏销售,而游戏则有助于芯片销售。从芯片制造商的营销角度来看,实时渲染的最佳特性之一,就是图形渲染将会消耗大量的处理能力和其他资源。与硬件相关的特性,例如帧率、分辨率和颜色深度等也会在一定程度上不断增长,从而进一步增加处理负载。最低 90 FPS 固定帧率是虚拟现实应用程序的标准,4k 显示器目前已经对图形系统保持速度的能力提出了考验\[1885]。
27 |
28 | 在场景中模拟光线效果的复杂任务,本身就需要大量的计算能力。在场景中添加更多的物体或者更多的光源,显然会使得渲染计算变得更加昂贵。物体的类型(包括固体和体积,例如雾)、这些物体表面的描绘方式、以及所使用的光源类型,也是一些可以增加复杂性的因素。如果我们能够获取更多的样本、计算更加精确的方程、或者仅仅是能够使用更多的内存,许多算法的质量都会得到很大的提升。这种不断增加的复杂性,使得图形处理能力几乎成了一个无底洞。
29 |
30 | 为了解决长期的性能问题,乐观主义者喜欢求助于摩尔定律(Moore’s Law)。摩尔定律的观测结果表明:每 1.5 年性能增加 2 倍;或者更加实用的是,每 5 年性能增加 10 倍\[1663]。但是处理器的速度通常并不是性能瓶颈,而且随着时间的推移,性能瓶颈发生在处理器上的概率会越来越小。带宽才是真正可能成为性能瓶颈的地方,因为其性能每 10 年才会增加 10 倍,而不是像处理器那样,每 5 年增加 10 倍\[1332]。
31 |
32 | 来自电影行业中的图形算法,经常可以应用到实时渲染中,因为这些领域的共同目标都是生成逼真的图像。让我们看看电影行业中的做法,我们能够看到一些统计数据,例如 2016 年的电影《奇幻森林(the Jungle Book)》,某一帧的场景中可能包含数百万根头发,每帧的渲染时间为 30 到 40 个小时\[1960]。由于 GPU 是专为实时渲染而构建的,因此相比 CPU 具有明显的处理优势,但从$ 1/(40 \times 60 $$\times$$ 60) = 0.00000694 $FPS 到 60 FPS,也大约有 7 个数量级。
33 |
34 | 本章节一开始的时候,我们承诺会进行一些预测,其中“更快更灵活(faster and more flexible)”就是最简单的一个。就 GPU 架构而言,一种可能性是 z-buffer 三角形光栅化管线将继续统治实时渲染。除了最简单的游戏之外,所有的游戏都会使用 GPU 来进行渲染。即使明天一醒来,就出现了某种令人难以置信的技术可以取代当前的管线,即使这种技术的速度要快一百倍;并且这种技术只需要下载一个系统补丁就可以运行,业界仍可能需要数年时间,才能迁移到这种新技术上。其中一个问题是在于,这种新方法是否可以使用与现有方法完全相同的 API,如果不行的话,那么想要采纳这种方法就仍然需要一段时间。一款复杂的游戏需要花费数千万美元甚至更多的开发成本,并且经常需要数年时间才能完成。游戏的目标平台一般都是在开发过程的早期选定的,这就决定了所使用算法和着色器的复杂程度,以及美术资产的大小和复杂程度。除了这些因素之外,还需要考虑到编写或者生产这些元素所需要的开发工具,并且用户还需要对这些工具的使用十分精通。即使真的有奇迹发生,当前光栅化流水线背后的惯性,也仍然会给它带来若干年的生命。
35 |
36 | 变化仍在发生(change still happens)。实际上,简单的“一个光栅化器统治一切(one rasterizer to rule them all)”的想法已经开始消退。在本书中,我们讨论了计算着色器所能承担的各种任务,证明了光栅化并不是 GPU 所能提供的唯一服务。如果某个新技术真的很有吸引力,那么从游戏公司到商业引擎,再到相关的内容创造工具,都会发生工作流的重新调整。
37 |
38 | 那么,从长远来看情况如何呢?用于渲染三角形、访问纹理和混合结果样本的 GPU 专用固定功能硬件,仍然可以显著提升性能。但是移动设备的需求改变了这个情况,因为功耗成为了与原始性能一样重要的因素。然而,基础管线的“即发即弃(fire-and-forget)”概念,即我们将一个三角形只发送到管线中一次,并使用这些信息来完成该帧的渲染处理,这种概念并不是现代渲染引擎中所使用的模型。变换、扫描、着色和混合的基本流水线模型,已经发展得几乎面目全非了。GPU 已经成为了一个基于流处理器的大型集群,我们可以随心所欲地使用它。
39 |
40 | 图形 API 和 GPU 发生了共同进化以适应这一现实,这里的咒语(mantra)是“灵活性(flexibility)”。图形渲染方法由研究人员进行探索,然后由开发人员在现有硬件上进行实现,从而确定他们所希望的功能是可以实现的。独立硬件供应商可以利用这些发现,以及他们自己的研究来开发通用功能,从而形成一个良性循环。对于任何单一算法进行优化都是徒劳的( fool’s errand),而创建新的、更加灵活的方式来访问和处理 GPU 上的数据则不是。
41 |
42 | 考虑到这一点,我们将射线与物体相交的功能,视为一种具有多种用途的通用工具。我们知道,使用路径追踪的完全无偏采样,最终将会产生正确的、真实的图像,并达到场景描述的极限。这里的“最终”才是问题所在,正如我们在章节 11.7 中所讨论的,路径追踪作为一种可行的算法,目前正面临着严峻的挑战。其主要问题在于,想要得到无噪声的结果,并且保证在动画过程中不会发生闪烁,所需的样本数量实在太大。但是,路径追踪的纯粹性和简单性使其极具吸引力。在当前的交互式渲染状态下,其中所使用的许多技术,都是专门为特定情况量身定制的,也就是说,我们想要实现某种效果,可能会为这个效果专门设计一种算法来进行处理,而现在只需要一种算法就可以完成所有的工作。电影工作室当然已经意识到了这一点,因为在过去的十年中,他们已经完全转向了光线追踪和路径追踪方法。这样做可以使得他们只对一组光线传输的几何操作进行优化即可。
43 |
44 | 实时渲染(包括所有的渲染方式),最终都是关于采样和过滤的问题。除了提高光线发射和求交的效率之外,路径追踪还可以从更加智能的采样和过滤策略中受益。事实上,无论营销文学(marketing literature)如何,几乎所有的离线路径追踪渲染器都是有偏的(biased)\[1276]。对发射采样射线的位置做出合理的假设,能够大幅提高性能表现。路径追踪可以从中受益的另一个领域是智能过滤(字面意思的智能)。深度学习目前是一个白热化的研究领域和开发领域,由于在 2012 年取得了令人印象深刻的进展,当它的表现远远超过了手动调整的图像识别算法时\[349],人们重新燃起了对其的兴趣。使用神经网络进行降噪\[95, 200, 247]和抗锯齿\[1534]是令人着迷的发展,如图 24.2 所示。我们已经看到,使用神经网络进行渲染相关任务的研究论文的数量大幅增加,更不用说建模和动画了。
45 |
46 | ![图24.2:基于神经网络的图像重建。左边是通过路径追踪生成的噪声图像。在右边的图像中,使用GPU加速的降噪算法,可以以交互式的速度来对图像进行处理。[200]](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/book/Real-Time-Rendering/images/Chapter-24/20231018153409.png "图24.2:基于神经网络的图像重建。左边是通过路径追踪生成的噪声图像。在右边的图像中,使用GPU加速的降噪算法,可以以交互式的速度来对图像进行处理。[200]")
47 |
48 | 最早可以追溯到 1987 年 AT\&T 的 Pixel Machine,它可以使用交互式的光线追踪,来在小场景、低分辨率、较少光源的情况下,实现尖锐的反射、折射和阴影。微软在 DirectX API 中添加了光线追踪功能,被称为 DXR,它简化了光线的发射过程,并激励硬件供应商增加对光线求交的硬件支持。光线发射(ray shooting),通过降噪技术或者其他滤波技术进行增强,将首先成为提高各种元素(例如阴影或者反射)渲染质量的一种技术。它将与许多其他算法进行竞争,每个渲染引擎会根据速度、质量和易用性等因素做出选择,如图 24.3 所示。
49 |
50 | 
51 |
52 | 截至到本文撰写时,作为基本操作的分层光线发射(hierarchical ray shooting)还不是任何主流商业 GPU 的明确部分。我们把 PowerVR 的 Wizard GPU \[1158]作为一个好兆头,因为已经有一家移动设备公司,正在考虑对分层场景描述提供光线求交的硬件支持。直接支持光线发射的新 GPU,将会改变效率方程(equations of efficiency),并且可能构建一个良性循环,使得各种渲染效果的定制化和专业化程度都大幅降低。一种方法是对眼睛光线(eye ray)进行光栅化,并使用光线追踪或者计算着色器来实现其他的一切效果,并且这种方法已经在各种 DXR demo \[1, 47, 745]中进行了使用。通过改进的降噪算法,更快的光线追踪 GPU,以及先前研究的重新应用,或者使用一些新的研究,我们预计很快就会看到相当于 10 倍的性能提升。
53 |
54 | 我们希望 DXR 能够在其他方面为开发人员和研究人员带来好处。对于游戏而言,通过投射光线的烘焙系统现在可以在 GPU 上进行运行,并使用与交互式渲染器相似或者相同的着色器,从而提高性能。可以更加容易地生成 ground truth 图像,使其能够更加容易地用于测试,甚至是对算法进行自动调整。架构改变的相关想法,允许更加灵活地生成 GPU 任务(例如:创建着色器工作),这似乎是一个强大的想法,可能会有其他方面的应用。
55 |
56 | GPU 的发展当然还有着其他令人着迷的可能性。另一种理想化的世界观,是世界中的所有物质都是体素化的。如章节 13.10 中所述,这种表示对于光线传输和光照模拟来说有许多优点。但是由于需要进行大量的数据存储,以及较难处理场景中的动态物体,这些因素使得完全切换到体素表示的可能性极小。尽管如此,我们相信体素可能会得到更多的关注,因为体素技术会在很广泛的领域中进行使用,包括高质量的体积效果、3D 打印和无约束的物体修改等(例如:Minecraft)。当然,考虑到自动驾驶汽车系统、激光雷达(LIDAR)和其他传感器会产生的大量的此类数据,因此相关的表示形式(点云)将会在未来几年中成为更多研究中的一部分。符号距离场(SDF)是另一种有趣的场景描述方法,与体素类似,SDF 可以对场景进行无限制的修改,也可以对光线跟踪进行加速。
57 |
58 | 有时,某些特定应用程序的独特约束,允许其开发人员“打破常规(break the mold)”,并且使用一些以前被认为是外来的或者是不可行的技术。诸如 Media Molecule(译者注:索尼的一个第一方工作室)的《Dreams》和 Second Order 的《粘土之书(Claybook)》(如图 24.4 所示)这样的游戏,这些游戏都使用了非传统的渲染算法,能够让我们对这样一个可能的渲染未来有一个有趣的了解。
59 |
60 | ,光线追踪阴影和AO等效果。并在GPU上对固体和液体效果进行了物理模拟。")
61 |
62 | 虚拟现实和混合现实值得一提。当 VR 运作良好时,它的效果是惊人的。而混合现实则展示了合成内容与现实世界相融合的迷人场景。每个人都想要一款能兼顾两者的轻型眼镜,但是短期内这种设备也可能会进入“个人喷气背包、水下城市”等无法实现的类别,但是谁又能知道呢?考虑到这些努力背后的大量研究和开发工作\[1187],可能会有一些改变世界的技术突破。
63 |
64 | ## 24.2 你
65 |
66 | 那么,当你的孩子和你孩子的孩子在等待奇点(The Singularity)到来的同时,你在做什么呢?当然是写程序:发现新的算法,创建应用程序,或者做其他你喜欢的事情。几十年前,一台机器图形硬件的价格要比一辆豪华汽车还贵;但是现在,它被内置到几乎所有具有 CPU 的设备中,而且这些设备还可以放在你的手中。图形入侵(graphics hacking)是廉价且主流的。在本小节中,我们将介绍在更多有用的资源,这些资源可以帮助你学习更多有关实时渲染领域中的知识和技术。
67 |
68 | 我们这本书并不是凭空存在的,它利用了大量已有的信息来源。如果你对其中的某个算法感兴趣,可以找到相关的原始出版物。我们的网站上有一个页面,其中包含了我们引用的所有文章,你可以在那里找到相应的资源链接(如果可以的话)。
69 |
70 | 大多数研究文章都可以使用谷歌学术(Google Scholar)或者作者的个人网站中找到,如果其他方法都失败了,那么还可以向作者索要一份文章副本,几乎每个人都喜欢让他们的工作被阅读和欣赏。
71 |
72 | 如果有些论文不是免费的话,那么诸如 ACM 数字图书馆(ACM Digital Library)等服务,包含了大量可用的文章。如果您是 SIGGRAPH 的成员,那么您可以自动免费访问他们的许多图形论文和演讲。还有一些期刊会发表相关的技术文章,例如 ACM Transactions on Graphics(现在包括了 SIGGRAPH 的论文集),The Journal of Computer Graphics Techniques(这是开放获取的),IEEE Transactions on Visualization and Computer Graphics,Computer Graphics Forum,IEEE Computer Graphics and Applications 等。最后,还有一些专业博客中存在有很好的信息,Twitter 上的图形开发人员和研究人员,经常会指出很棒的新资源。
73 |
74 | 学习他人和结识他人的最快方法之一就是参加会议,很有可能另一个人正在做你感兴趣或者可能感兴趣的事情。如果你资金紧张的话,那么请联系相关的会议组织者,询问志愿者机会或者奖学金。SIGGRAPH 和 SIGGRAPH Asia 年会是新思想的主要场所,但并非是唯一场所。还有一些其他的技术集会,例如 Eurographics 会议和 Eurographics 图形学渲染研讨会(Eurographics Symposium on Rendering,EGSR),交互式 3D 图形和游戏研讨会(Symposium on Interactive 3D Graphics and Games,I3D),以及高性能图形系统(High Performance Graphics,HPG)论坛展示并发布了大量与实时渲染相关的资料。还有一些专门针对开发者的会议,例如 GDC (Game Developers Conference,游戏开发者大会)。当你在排队或者参加活动的时候,记得向陌生人打招呼。特别是在 SIGGRAPH 上,请留意您感兴趣领域的同类聚会(birds of a feather,BOF)。与人们面对面地交流思想是既有益又充满活力的。
75 |
76 | 还有一些与交互式渲染相关的电子资源。特别值得注意的是,《Graphics Codex》是一个高质量的纯电子参考资料,并且具有不断更新的优点。沉浸式线性代数(immersive linear algebra)网站中的部分内容,由本书的合著者所创建,其中包括了交互式的演示内容,对这个主题的学习有所帮助。Shirley 有一本关于光线追踪的优秀的 Kindle 短篇书籍(《Ray Tracing in One Weekend》)。我们期待着这类资源变得廉价和更容易获取。
77 |
78 | 印刷书籍仍有一席之地。除了通用论文和特定领域的书籍,还有一些经过编辑的文章集合,其中包括了大量的研究信息和发展信息,其中的许多内容在本书中进行了引用。最近的例子是《GPU Pro》和《GPU Zen》书籍。一些较旧的书籍,例如《Game Programming Gems》、《GPU Gems》(免费在线)和《ShaderX》系列中仍然包含一些相关的文章,因为其中一些算法的原理并不会过时。所有的这些书籍,都允许游戏开发者在不撰写正式会议论文的前提下,就可以展示他们的方法。这样的文章合集还允许学者对他们工作的技术细节进行讨论,这些细节可能并不适合出现在研究论文中。对于专业的开发人员而言,从一篇文章中阅读一些实现细节所节省的一个小时,可能要比阅读整本书的成本更有价值。如果你等不及实体书被送到你的手里,可以使用亚马逊上的“Look Inside”功能,或者是在谷歌图书上搜索文本,可能会得到一个能够让我们开始(get you started)的摘录。
79 |
80 | 说完了,做完了,就需要开始写代码了。随着 GitHub、Bitbucket 和类似仓库的兴起,我们拥有一个丰富的代码仓库可以进行利用。困难的部分是知道哪些部分不属于 Sturgeon 定律(Sturgeon’s Law:任何事物中,其中 90%都是垃圾)。像虚幻引擎这样的产品已经开放了它们的源代码,它是一个不可思议的资源。ACM 现在鼓励任何已发表的技术文章公布各自的源代码。你所尊敬的作者有时候也会提供他们的源代码代码,尝试进行搜索。
81 |
82 | Shadertoy 是一个特别值得注意的网站,它经常在像素着色器中使用光线步进来展示各种技术。虽然其中的许多程序首先是赏心悦目的,但是该网站中包含了许多具有教育意义的 demo,并且所有的代码都是可见的,并且可以在浏览器中进行运行。另一个基于浏览器的 demo 来源是 three.js 仓库和相关网站。“Three.js”是对 WebGL 的封装,它很容易进行实验,因为只需要几行代码就可以生成渲染结果。并且只需要点击一个超链接,就可以在网上发布 demo,任何人都可以进行运行和分析,这对于教育用途和分享想法而言是非常棒的。本书的作者之一基于 three.js,为 Udacity(一个在线教育平台)创建了一门图形入门课程。
83 |
84 | 我们再次向您推荐我们的在线网站[realtimerendering.com](http://xn--realtimerendering-2880aa375khk1f3qgda088gow2ct4zdspyagy1arhyv99cc8xd.com "realtimerendering.com")。在那里你会发现许多其他有用的资源,例如推荐书目和新书列表(其中还包含一些免费的高质量内容),以及一些链接,它们指向具有价值的博客、研究网站、课程演示和许多其他的信息来源。去寻找快乐吧!
85 |
86 | 我们最后的忠告是去学习,去实践。实时计算机图形领域在不断地发展,新的想法和新的特性不断被发明和集成。你可以参与其中。虽然所使用的技术种类繁多,看起来也令人生畏,但是你不需要实现一长串的 buzzwords-dujour(字面意思是今日流行语)就能得到好的结果。根据应用程序的约束条件以及所需要的视觉风格,巧妙地组合少量技术就可以得到与众不同的视觉效果。在 GitHub 上分享你的结果,GitHub 还可用来托管博客。去参与吧!
87 |
88 | 这个领域最好的地方之一,就是它每隔几年就会自我改造一次(reinvents itself)。计算机架构也在不断变化和改进。几年前行不通的方案,现在可能就可以实现了。每一款新的 GPU 都会带来不同的功能、速度和内存组合。具体什么是高效的,哪部分会成为性能瓶颈,都在不断变化和发展。即使是那些看起来古老而成熟的部分,也值得重新审视。有有一种说法是,创造是一种扭曲、打破和融合其他想法的过程,而不是从无到有的过程。
89 |
90 | 44 年前(2018-1974 年),Sutherland、Sproull 和 Schumacker 发表了计算机图形学领域中的一个里程碑论文:“A Characterization of Ten Hidden-Surface Algorithms”。在他们长达 55 页的论文中,进行了令人难以置信的全面对比分析。其中有一个被描述为“极其昂贵”的算法,这种暴力技术甚至连研究人员的名字都没有,只在附录中被提到过,它现在被称为 z-buffer。公平地说,z-buffer 的发明者是 Ed Catmull,Sutherland 是他的导师,Ed Catmull 对 z-buffer 概念进行讨论的论文,在几个月之后才发表。
91 |
92 | 在 1974 年的这篇论文中,讨论并对比了 10 种隐藏表面的算法,但是实际上最终胜出的是第 11 种,因为它在硬件上易于实现,并且随着硬件技术的进步,存储密度在不断上升,成本也随之下降。但是 Sutherland 等人所做的“十大算法”调查,在当时是完全有效的。随着条件的不读变化,所使用的算法也会发生改变。未来几年到底会发生什么变化,是一件令人兴奋的事情。在将来的某一天,当我们对目前渲染技术时代进行回顾的时候,会有什么感觉呢?没有人知道,每个人都可能会对未来产生重大影响。没有唯一的未来,没有必然会发生的过程。是你创造了它。
93 |
94 | 
95 |
--------------------------------------------------------------------------------
/01~真实感渲染/99~参考资料/2020~《GAMES 101》课程笔记/18~Advanced Topics in Rendering.md:
--------------------------------------------------------------------------------
1 | ## 18.Advanced Topics in Rendering
2 |
3 | ### 18.1 Advanced Light Transport
4 |
5 | 
6 |
7 | 无偏光线传播方法:BDPT、MLT
8 |
9 | 有偏光线传播方法:光子映射、VCM
10 |
11 | 实时路径追踪方法
12 |
13 | 
14 |
15 | 有偏性、一致性说明
16 |
17 | ### 18.2 Bidirectional Path Tracing
18 |
19 | 
20 |
21 | 从光源和摄像机分别出一些光线并连接在一起
22 |
23 | 
24 |
25 | 对于主要由间接光照照亮的场景而言,双向路径追踪的效率会高于单向路径追踪
26 |
27 | ### 18.3 Metropolis Light Transport
28 |
29 | 
30 |
31 | Metropolis 是人名而非大都市
32 |
33 | 基于马尔可夫链的采样方式,由上一个采样样本生成下一个新样本,进行估计函数值。
34 |
35 | 这种方式可以使采样的分布和实际 pdf 的分布一致,保证方差比较小,收敛效率比较高。
36 |
37 | 
38 |
39 | 对于复杂的场景渲染效果很好。
40 |
41 | 
42 |
43 | 但这个方法也有坏处,主要是不好估计什么时候会没有噪声。
44 |
45 | 并且,各个点的收敛率不同,导致图可能比较脏,以至于还不能应用于动画
46 |
47 | ### 18.4 Photon Mapping
48 |
49 | 
50 |
51 | 光子映射方法,非常适合于渲染光线聚焦产生特殊图案(caustics 现象)的场景
52 |
53 | 
54 |
55 | 一种实现方式是分成两步:
56 |
57 | 1. 先打出光子,并停在漫反射物体上
58 | 2. 第二步从视角出发打到表面上
59 |
60 | 
61 |
62 | 对局部进行密度估计,值越高则越亮
63 |
64 | 
65 |
66 | 但这种方法的关键是取光子数量,数量太少会噪声,数量太大会糊
67 |
68 | 仅当光子数量非常多之后才能接近正确结果。
69 |
70 | 所以是有偏但是一致的方法
71 |
72 | 
73 |
74 | 渲染中直观地理解有偏和一致的方法是:
75 |
76 | 1. 如果糊则有偏
77 | 2. 如果无限时不糊则一致
78 |
79 | ### 18.5 Vertex Connection and Merging
80 |
81 | 
82 |
83 | 结合了光子映射和双向路径追踪的思路,不让任何一个路径被浪费,最后表现也不错
84 |
85 | ### 18.6 Instant Radiosity
86 |
87 | 
88 |
89 | 将被照亮的表面也当作光源,并取上面的一些点作为虚拟点光源
90 |
91 | 
92 |
93 | 在有的场景中效果不错
94 |
95 | 但偶尔会有亮点,主要因为面积估计时偶尔会以一个极近的距离,导致最后除下来亮度非常高
96 |
97 | ### 18.7 Advanced Appearance Modeling:Intoduction
98 |
99 | 
100 |
101 | 对一些材质用真实微观建模的方式表现和渲染
102 |
103 | ### 18.8 Participating Media
104 |
105 | 
106 |
107 | 比如对于散射介质:雾
108 |
109 | 
110 |
111 | 
112 |
113 | 用一个相位函数来表达其散射方式
114 |
115 | 
116 |
117 | 光线和体积进行作用最后到达眼睛
118 |
119 | 
120 |
121 | 散射介质超能特工队中的应用
122 |
123 | 
124 |
125 | 散射介质在刺客信条中的应用
126 |
127 | 
128 |
129 | 即使是巧克力也会有一些光线会进入体积内再穿透出来
130 |
131 | 人的皮肤也是如此
132 |
133 | ### 18.9 Participating Media:Hair
134 |
135 | 
136 |
137 | 头发也是这样的例子
138 |
139 | 
140 |
141 | 可以仅仅把头发当成一个圆柱并只考虑一次反射
142 |
143 | 
144 |
145 | 但这样得到的效果并不算非常好
146 |
147 | 
148 |
149 | 而当进一步把头发当成一个可被穿透的圆柱
150 |
151 | 
152 |
153 | 考虑直接反射(R),折射再折射(TT),折射反射再折射(TRT)三种光线
154 |
155 | 
156 |
157 | 便能得到非常不错的结果
158 |
159 | 
160 |
161 | 最终幻想里,头发建模的应用
162 |
163 | 
164 |
165 | 疯狂动物城中头发建模的应用
166 |
167 | 
168 |
169 | 事实上,人类的头发和动物的毛发也是不同的,直接套用也会使结果显得不那么自然
170 |
171 | 
172 |
173 | 这是由于人类和动物毛发中 Medulla 占比不一致导致的
174 |
175 | 
176 |
177 | 一个改变 Medulla 得到不同结果的例子。可见微观性质差异有时候对宏观的影响也是非常显著的
178 |
179 | 
180 |
181 | 考虑 Medulla 后对头发渲染的影响
182 |
183 | 
184 |
185 | 用双圆柱模拟含 Medulla 的头发模型
186 |
187 | 
188 |
189 | 几种光线作用后的效果
190 |
191 | 
192 |
193 | 巨量的建模细节和采样率
194 |
195 | 
196 |
197 | 双层圆柱毛发模型在猩球崛起中的应用
198 |
199 | 
200 |
201 | 双层圆柱毛发模型在狮子王中的应用
202 |
203 | ### 18.10 Granular Material
204 |
205 | 
206 |
207 | Granular Material 的一些例子
208 |
209 | 
210 |
211 | 
212 |
213 | Pixar 应用 Granular Material 的动画短片
214 |
215 | ### 18.11 Translucent Material
216 |
217 | 
218 |
219 | 玉
220 |
221 | 
222 |
223 | 次表面反射
224 |
225 | 
226 |
227 | 描述次表面反射需要对渲染方程增加额外一个维度
228 |
229 | 
230 |
231 | Dipole 有一种模拟的近似方案是在表面下方加入一个光源,模拟次表面反射的效果
232 |
233 | 
234 |
235 | 仅用表面反射表现大理石
236 |
237 | 
238 |
239 | 加入次表面反射后的大理石
240 |
241 | 
242 |
243 | 是否有考虑次表面反射的皮肤效果对比
244 |
245 | 
246 |
247 | BSSRDF 渲染出的三个人物,非常接近真实照片
248 |
249 | ### 18.12 Cloth
250 |
251 | 
252 |
253 | 理解布料需要从其层级结构说起
254 |
255 | 首先由纤维(Fibers) 相互缠绕,形成股(Ply)
256 |
257 | 再由股(Ply)相互缠绕,形成线(Yarn)
258 |
259 | 最后线再通过不同的纺织方式,最后得到布料
260 |
261 | 
262 |
263 | 各种不同的编织方式会得到不同的布料效果
264 |
265 | 
266 |
267 | 当然,也可以把布料当作一个表面取渲染。但效果经常是有限的。
268 |
269 | 
270 |
271 | 所以一种更复杂但表现效果好的方式是真实地把布料建模成有体积有纺织方式的空间物体,再进行渲染,可以得到非常好的效果。
272 |
273 | 
274 |
275 | 甚至把纤维细节都给建模出来进行渲染
276 |
277 | 
278 |
279 | 布料在电影中的一些应用
280 |
281 | ### 18.13 Detailed Appearance
282 |
283 | 
284 |
285 | 渲染出的车和鼠标都略有不真实的感觉
286 |
287 | 
288 |
289 | 主要是由于现实中的这些物体都不会太完美,表面应有划痕等等
290 |
291 | 
292 |
293 | 没有细节的水壶
294 |
295 | 
296 |
297 | 对比有细节的水壶
298 |
299 | 
300 |
301 | 统计学上的正态分布和实际的正态分布是有区别的
302 |
303 | 
304 |
305 | 可以加入噪声函数去影响表面
306 |
307 | 
308 |
309 | 当然,要达到那种细节刻画度,会非常难以渲染
310 |
311 | 
312 |
313 | 并且也主要难在有效采样
314 |
315 | 
316 |
317 | 一种优化方式是把对应反射区域的法线分布给算出来,作为近似
318 |
319 | 
320 |
321 | 不同尺度下,这个近似的差异有可能比较大,尺度越大通常越平滑,尺度越小通常越有特征
322 |
323 | 
324 |
325 | 一些特殊的发现贴图采样后分布也会呈现不同的性质
326 |
327 | 
328 |
329 | 这种算法线分布方法进行渲染的一些应用
330 |
331 | 
332 |
333 | 
334 |
335 | ### 18.14 Wave Optics
336 |
337 | 
338 |
339 | 当对于微观时,如果进一步考虑光波的性质则会出现一些新的问题,比如光波会衍射等等
340 |
341 | 
342 |
343 | 比如照一个拉丝过的金属表面,会看见有很多颜色
344 |
345 | 
346 |
347 | 如 Macbook 放大后也是非白色,会有很多彩色的点
348 |
349 | 
350 |
351 | 要处理的话需要考虑光的波动方程,并在复数域上积分
352 |
353 | 
354 |
355 | 非常复杂,但一旦做出来,能够得到很接近照片的效果
356 |
357 | 
358 |
359 | 放大看
360 |
361 | ### 18.15 Procedural Appearance
362 |
363 | 
364 |
365 | 用噪声函数去随用随取地表达空间中任一一点的纹理参数
366 |
367 | 
368 |
369 | 噪声函数生成纹理的实例
370 |
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2010~java-codes/Computational_Geometry_Check_left_right.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "Computational_Geometry:Check_left_right.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": [],
9 | "authorship_tag": "ABX9TyPFW3bD6gR0TSJkteT7Wxt9",
10 | "include_colab_link": true
11 | },
12 | "kernelspec": {
13 | "name": "python3",
14 | "display_name": "Python 3"
15 | }
16 | },
17 | "cells": [
18 | {
19 | "cell_type": "markdown",
20 | "metadata": {
21 | "id": "view-in-github",
22 | "colab_type": "text"
23 | },
24 | "source": [
25 | "
"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "metadata": {
31 | "id": "gYmKgckHxWzA",
32 | "colab_type": "code",
33 | "colab": {}
34 | },
35 | "source": [
36 | "# Input: A tuple including a list of points that form a line ([p1, p2]) and a third point p3.\n",
37 | "# Output: Check if p3 is on the left/right of the line segment p1p2."
38 | ],
39 | "execution_count": 0,
40 | "outputs": []
41 | },
42 | {
43 | "cell_type": "code",
44 | "metadata": {
45 | "id": "mv71N8lmxx94",
46 | "colab_type": "code",
47 | "colab": {}
48 | },
49 | "source": [
50 | "import numpy as np\n",
51 | "import matplotlib.pyplot as plt\n",
52 | "%matplotlib inline"
53 | ],
54 | "execution_count": 0,
55 | "outputs": []
56 | },
57 | {
58 | "cell_type": "code",
59 | "metadata": {
60 | "id": "H2Mm0h7xxz0k",
61 | "colab_type": "code",
62 | "colab": {}
63 | },
64 | "source": [
65 | "def check_left_right(points):\n",
66 | " data = np.array(points[0])\n",
67 | " point = np.array(points[1])\n",
68 | " # print(data)\n",
69 | " # print(point)\n",
70 | " x, y = data.T\n",
71 | " plt.scatter(x, y)\n",
72 | " plt.scatter(point[0], point[1])\n",
73 | " plt.show()\n",
74 | " o = (data[1][1]-data[0][1])*point[0] + (data[0][0]-data[1][0])*point[1] + (data[0][1]*data[1][0]) - (data[0][0]*data[1][1])\n",
75 | " if(o < 0):\n",
76 | " return \"Left\"\n",
77 | " if(o > 0):\n",
78 | " return \"Right\"\n",
79 | " if(o == 0):\n",
80 | " return \"line\""
81 | ],
82 | "execution_count": 0,
83 | "outputs": []
84 | },
85 | {
86 | "cell_type": "code",
87 | "metadata": {
88 | "id": "bP1qJgWayYEi",
89 | "colab_type": "code",
90 | "outputId": "02e4fc6f-0a6d-4be8-bd23-c8aa60e5081d",
91 | "colab": {
92 | "base_uri": "https://localhost:8080/",
93 | "height": 282
94 | }
95 | },
96 | "source": [
97 | "check_left_right(([(1, 1), (2, 2)], (3, 3)))"
98 | ],
99 | "execution_count": 0,
100 | "outputs": [
101 | {
102 | "output_type": "display_data",
103 | "data": {
104 | "image/png": "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\n",
105 | "text/plain": [
106 | ""
107 | ]
108 | },
109 | "metadata": {
110 | "tags": [],
111 | "needs_background": "light"
112 | }
113 | },
114 | {
115 | "output_type": "execute_result",
116 | "data": {
117 | "text/plain": [
118 | "'line'"
119 | ]
120 | },
121 | "metadata": {
122 | "tags": []
123 | },
124 | "execution_count": 7
125 | }
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "metadata": {
131 | "id": "fLcNN5vKyu7A",
132 | "colab_type": "code",
133 | "colab": {}
134 | },
135 | "source": [
136 | ""
137 | ],
138 | "execution_count": 0,
139 | "outputs": []
140 | }
141 | ]
142 | }
--------------------------------------------------------------------------------
/99~参考资料/2008~Mark~《Computational Geometry: Algorithms and Applications》/codes/2018~python-codes/Computational_Geometry_Check_left_right.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "Computational_Geometry:Check_left_right.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": [],
9 | "authorship_tag": "ABX9TyPFW3bD6gR0TSJkteT7Wxt9",
10 | "include_colab_link": true
11 | },
12 | "kernelspec": {
13 | "name": "python3",
14 | "display_name": "Python 3"
15 | }
16 | },
17 | "cells": [
18 | {
19 | "cell_type": "markdown",
20 | "metadata": {
21 | "id": "view-in-github",
22 | "colab_type": "text"
23 | },
24 | "source": [
25 | "
"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "metadata": {
31 | "id": "gYmKgckHxWzA",
32 | "colab_type": "code",
33 | "colab": {}
34 | },
35 | "source": [
36 | "# Input: A tuple including a list of points that form a line ([p1, p2]) and a third point p3.\n",
37 | "# Output: Check if p3 is on the left/right of the line segment p1p2."
38 | ],
39 | "execution_count": 0,
40 | "outputs": []
41 | },
42 | {
43 | "cell_type": "code",
44 | "metadata": {
45 | "id": "mv71N8lmxx94",
46 | "colab_type": "code",
47 | "colab": {}
48 | },
49 | "source": [
50 | "import numpy as np\n",
51 | "import matplotlib.pyplot as plt\n",
52 | "%matplotlib inline"
53 | ],
54 | "execution_count": 0,
55 | "outputs": []
56 | },
57 | {
58 | "cell_type": "code",
59 | "metadata": {
60 | "id": "H2Mm0h7xxz0k",
61 | "colab_type": "code",
62 | "colab": {}
63 | },
64 | "source": [
65 | "def check_left_right(points):\n",
66 | " data = np.array(points[0])\n",
67 | " point = np.array(points[1])\n",
68 | " # print(data)\n",
69 | " # print(point)\n",
70 | " x, y = data.T\n",
71 | " plt.scatter(x, y)\n",
72 | " plt.scatter(point[0], point[1])\n",
73 | " plt.show()\n",
74 | " o = (data[1][1]-data[0][1])*point[0] + (data[0][0]-data[1][0])*point[1] + (data[0][1]*data[1][0]) - (data[0][0]*data[1][1])\n",
75 | " if(o < 0):\n",
76 | " return \"Left\"\n",
77 | " if(o > 0):\n",
78 | " return \"Right\"\n",
79 | " if(o == 0):\n",
80 | " return \"line\""
81 | ],
82 | "execution_count": 0,
83 | "outputs": []
84 | },
85 | {
86 | "cell_type": "code",
87 | "metadata": {
88 | "id": "bP1qJgWayYEi",
89 | "colab_type": "code",
90 | "outputId": "02e4fc6f-0a6d-4be8-bd23-c8aa60e5081d",
91 | "colab": {
92 | "base_uri": "https://localhost:8080/",
93 | "height": 282
94 | }
95 | },
96 | "source": [
97 | "check_left_right(([(1, 1), (2, 2)], (3, 3)))"
98 | ],
99 | "execution_count": 0,
100 | "outputs": [
101 | {
102 | "output_type": "display_data",
103 | "data": {
104 | "image/png": "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\n",
105 | "text/plain": [
106 | ""
107 | ]
108 | },
109 | "metadata": {
110 | "tags": [],
111 | "needs_background": "light"
112 | }
113 | },
114 | {
115 | "output_type": "execute_result",
116 | "data": {
117 | "text/plain": [
118 | "'line'"
119 | ]
120 | },
121 | "metadata": {
122 | "tags": []
123 | },
124 | "execution_count": 7
125 | }
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "metadata": {
131 | "id": "fLcNN5vKyu7A",
132 | "colab_type": "code",
133 | "colab": {}
134 | },
135 | "source": [
136 | ""
137 | ],
138 | "execution_count": 0,
139 | "outputs": []
140 | }
141 | ]
142 | }
--------------------------------------------------------------------------------