git submodule项目子模块
- Git Submodule
- (子模块的代码并不直接存储在父仓库中,而是通过一个指针来维护)
- 克隆含有子模块的仓库时,使用git管理
- Git Clone
- **(**复制一份完整的Git仓库到本地)
- 若仓库包含子模块,普通的克隆命令不会获取子模块内容,
- Git Submodule的操作
- git submodule update --init --recursive初始化并更新(所有子模块,包括嵌套子模块)
- git submodule update <子模块目录>更新指定的子模块
- git fetch <子模块 URL>查看子模块远程仓库的最新状态 git reset --hard <子模块版本>更新到指定版本
- 添加后,在项目就会出现.gitmodules文件
- 其他:#include <GLFW/glfw3.h>为什么要加GLFW,因为这是文件夹名
深度测试
-
深度测试 glEnable被启用 的时候,会模板测试运行之后运行,如果这个测试 通过了的话,**深度缓冲(0------1)**将会更新为新的深度值。如果失败了,片段将会被丢弃
-
深度缓冲(向一个窗口的矩形)由窗口系统自动创建的,通常和颜色缓冲有着一样的宽度和高度。会以16、24或32位float的形式精度储存它的深度值(gl_FragCoord的z分量)
-
glViewport定义的窗口的大小,内建变量gl_FragCoord的x和y分量代表了 片段的 屏幕空间坐标(其中(0, 0)位于左下角),gl_FragCoord的z分量,它包含了片段真正的深度值
-
因为每次渲染时深度值有可能更新,每次渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲,否则你会仍在使用上一次渲染迭代中的写入深度值:
-
禁用深度缓冲的写入,使用一个只读的glDepthMask(GL_FALSE);
-
glDepthFunc ()深度测试函数,修改深度测试中使用的比较运算符,来决定是否通过测试:每渲染一个片段,将深度值写进缓冲,将这个片段 的深度值与深度缓冲中深度值比较
-
深度值计算的精度(精度越高,深度值变化越明显):
- 观察空间中z值(近平面(Near)和远平面(Far)之间的任何值)变换到[0, 1]范围之间
- 线性:......
- 非线性:z值很小的时候提供非常高的精度,而在z值很远的时候提供更少的精度。根据1/z,随着z的增加,变化越来越慢。因为z越大,1/z越小,所以其余变量,也都变化为倒数
-
深度值可视化:
- (0------1)(暗------亮)FragColor = vec4(vec3(gl_FragCoord.z), 1.0);因为0,0,0颜色是黑色。
- 这时候注意到全都是白色,我们尝试极小心的靠近物体,才会看到一瞬间变为黑色,这是因为深度值是非线性的。
- 转化为线性NDC:
cpp
float near = 0.1;
float far = 100.0;
float LinearizeDepth(float depth)
{
float z = depth * 2.0 - 1.0; // back to NDC
return (2.0 * near * far) / (far + near - z * (far - near));
}
void main()
{
float depth = (LinearizeDepth(gl_FragCoord.z)-near)/ (far-near);
FragColor = vec4(vec3(depth), 1.0);
}
- 理解非线性深度转为线性深度的运算过程:
- *投影(3D到2D)矩阵的作用:视图坐标------裁剪坐标
- 过程1:视口坐标(视锥剔除:裁剪为视锥体)------裁剪坐标------标准化坐标NDC(映射到边长为1的正方形内部)(-1------1)------深度值(非线性变换(0------1))
- 注意:视口空间中,坐标是右手坐标系,NDC是左手坐标系,所以z值相反
- 理解投影矩阵:
- 视口坐标xeyeze(*投影矩阵)------裁剪坐标xcyczc(/w)------NDCxnynzn:
- 设视口坐标范围,l,r,b,t,-n,-f,左 边界、右 边界、底部 、顶部 、近 边界和远边界值
- 将某一个坐标xeyeze转为裁剪坐标:
- 首先xeye映射到近平面(从视图坐标和相机连线,使用相似三角形的比率计算)
- ze映射到-n近平面
- 转为裁剪坐标:
- 从 [L, R] 到 [-1, 1] 的 x 坐标范围,从 [b, t] 到 [-1, 1] 的 y 坐标范围,
- 从 [-n, -f] 到 [-1, 1] 的 z 坐标范围。
- 裁剪坐标w和z有关,投影矩阵最后一行为0,0,-1,0,从而w = -z
- 转为DNC:
- *投影矩阵后,裁剪坐标依旧是齐次坐标,但这时候的坐标的xy分量,已经转化为了近平面上,需要xc/wc, yc/wc,zc/wc,最终成为归一化设备坐标
- 我们已经知道了所有的运算,参考包括投影矩阵的所有条目,现在根据过程1,转为线性深度:
- 过程2:深度值------标准化坐标NDC------裁剪坐标------视口坐标------深度值(线性深度计算)
- 深度冲突:没有足够的精度来决定两个形状哪个在前面
- 不要把多个物体摆得太靠近,
- 将近平面(Near)设置远一些,将近平面设置太远将会导致近处的物体被裁剪掉