Browse Source

pipe line

usuiforhe 3 năm trước cách đây
mục cha
commit
68dfc8740b

BIN
图形学/Image/48.png


BIN
图形学/Image/49.png


BIN
图形学/Image/50.png


BIN
图形学/Image/51.png


BIN
图形学/Image/52.png


BIN
图形学/Image/53.png


BIN
图形学/Image/54.png


BIN
图形学/Image/55.png


BIN
图形学/Image/56.png


BIN
图形学/Image/57.png


BIN
图形学/Image/58.png


+ 136 - 3
图形学/图形学.md

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2021-10-01 11:33:27
- * @LastEditTime: 2022-02-23 01:17:38
+ * @LastEditTime: 2022-02-24 00:06:14
  * @LastEditors: Please set LastEditors
  * @Description: In User Settings Edit
  * @FilePath: D:\MarkdownLog\图形学.md
@@ -1153,12 +1153,12 @@ shading,引入物体的明暗的不同,颜色的不同,**对不同的物
   - 颜色color
   - 光的亮度 shininess
 
+![](./Image/43.png)
+
 > 所有的方向都是单位向量,只表示方向
 
 #### 漫反射
 
-![](./Image/43.png)
-
 > 暂且只讨论某一个点的着色,也就是只考虑光照的方向,而不考虑照向这个点的光是不是被挡住了
 
 ![](./Image/44.png)
@@ -1198,6 +1198,139 @@ $$
 
 通过定义$k_d$颜色系数,可以定义该物体整体上的明暗
 
+#### 高光
+
+高光:物体、平面比较光滑,所以反射光线的方向都接近镜面反射的方向
+
+![](./Image/48.png)
+
+图中R表示镜面反射的方向,黄色部分表示高光反射的区域,v表示观察方向
+
+所以当观察方向与镜面反射方向相近的时候,可以看到物体的高光
+
+在Blinn-Phong模型中,观察方向与镜面反射方向接近的时候,说明了平面的法线方向和 **半程向量(half vector)** 接近
+
+![](./Image/49.png)
+
+$$
+半程向量:\vec{h} = bisector(\vec{v}, \vec{l}) = \frac{\vec{v} + \vec{l}}{\lVert \vec{v} + \vec{l} \rVert} 
+\\
+L_s = k_s(I / r^2)max(0, \cos \alpha)^p
+\Rightarrow 
+k_s(I / r^2)max(0, n \cdot h)^p
+$$
+
+- 高光的计算公式 $L_s$
+  - $k_s$高光系数,颜色之类的,跟漫反射系数类似
+  - $(I / r^2)$跟漫反射中的一样,高达此处的光的强度
+  - $max(0, \vec{n} \cdot \vec{h})^p$根据观察角度能得到多少光
+
+1. 为啥使用半程向量:半程向量的计算比直接计算光的镜面反射向量简单
+2. $\cos \alpha$,在$0~\pi$是单调递减的,复合这里$\alpha$越小高光越多的情况
+3. 不考虑从$\cos \alpha$为负数的情况,此时光从下面照射
+4.  $max(0, \vec{n} \cdot \vec{h})^p$中指数p的作用如图下所示,通过参数p可以指定高光范围的大小(p越大,高光范围越小,对应下图p越大,数据变小越快,一般100~200)
+
+![](./Image/50.png)
+
+![](./Image/51.png)
+
+从上到下 高光系数 $k_s$ 逐渐变大,可以发现越来越亮;从左到右 指数p 逐渐变大,高光范围逐渐变小
+
+#### 环境光照
+
+对于处于物体背面的平面不一定就是黑色的,因为有环境光的存在,虽然不会被光线直接照射到,但是会被其他平面的漫反射光照到
+
+在Blinn-Phong模型中,直接大胆假设:任何一个点接收到来自环境的光永远是相同的
+
+![](./Image/52.png)
+
+从图中可以发现,环境光与光照角度无光,与观察角度无关(每个角度观察都一样),因此环境光是一个**常数**,即是某一种颜色(比如说一个物体,在任何地方都有一个固定的颜色)
+
+环境光保证一个物体不是全是黑色的,在高光、漫反射计算完之后叠加环境光,提升一个亮度
+
+$$
+L_a = k_aI_a
+$$
+
+- 环境光 $L_a$
+  - $K_a$ 环境光照系数
+
+#### 累加
+
+![](./Image/53.png)
+
+> Ambient 环境光、Diffuse 漫反射、Specular 高光
+
+$$
+L = L_a + L_d + L_s= 
+k_aI_a + k_d(I / r^2)max(0, \vec{n} \cdot \vec{l}) + k_s(I/r^2)max(0, \vec{n} \cdot \vec{h})^p
+$$
+
+### 着色频率
+
+![](./Image/54.png)
+
+三个球的几何表示在空间中是一样的,但是表现出来的结果却不相同 
+
+着色频率:要把着色应用在哪些点上 
+
+比如图中最左边的球,就是把着色应用在一个**面**上,即一个平面有一个固定发现,求出的结果被应用在整个面上(**Flat Shading**)
+
+比如图中中间的球,一个平面有四个**顶点**,算出每个顶点对应的法线,那么每个顶点都有自己的着色效果,通过差值插值运算,让平面中有较为平滑的过度(**Gouraud Shading**)
+
+比如图中最右边的球,就是把着色应用在每一个**像素上**(**Phong Shading**)
+
+> **Phong Shading**并不是**Blinn-Phong**,前者是着色频率,后者是着色模型
+
+![](./Image/55.png)
+
+图中每一行的模型相同,从上网下模型精细度增加
+
+从图中可以观察到,当几何体足够精细的情况下,就可以使用相对简单的**Flat Shading**着色频率,得到的结果其实也不差
+
+> 当面足够精细的时候,就不一定要使用**Gouraud Shading** 或者 **Phong Shading**
+
+所以运用何种着色频率,需要根据具体几何体的情况而定,而不是一味的选择像素频率**Phong Shading**
+
+### 计算法线
+
+法线:垂直于平面的向量
+
+**顶点的法线**:顶点相邻面的法线的平均值
+
+![](./Image/56.png)
+
+$$
+N_v = \frac{\sum _iN_i}{\lVert \sum _iN_i \rVert}
+$$
+
+**逐像素法线**:通过重心坐标
+
+### 图形管线、实时渲染管线
+
+如何从场景到一张图?
+
+管线其实就是表示一系列不同的操作
+
+![](./Image/57.png)
+
+1. 三维空间的点投影到平面上
+2. 模型的点形成三角形
+3. 光栅化,进行离散操作
+4. 着色
+5. 渲染到屏幕
+
+![](./Image/58.png)
+
+这里**shading**既有可能发生在**Vertex Processing**也有可能发生**Fragment Processing**,因为渲染频率的问题,因为渲染频率既可能是顶点频率,也可能是像素频率,而这就影响了渲染管线的处理顺序
+
+Shader控制顶点管线(**Vertex Processing**)和着色管线如何运作(**Fragment Processing**)
+
+现在GPU允许通过编程的方式,处理顶点、像素的着色操作,通过shader的方式
+
+- OpenGL: GLSL语言
+- DirectX: HLSL语言
+
 # 几何
 
 如何表示光滑的曲线、曲面、将简单曲面通过细分的方法得到复杂曲面、形状发生变化时面如何变化、如何保持物体的拓扑结构…