OpenGL3.3_C++_Windows(11)

git submodule项目子模块

  1. Git Submodule
    1. (子模块的代码并不直接存储在父仓库中,而是通过一个指针来维护)
    2. 克隆含有子模块的仓库时,使用git管理
  2. Git Clone
    1. **(**复制一份完整的Git仓库到本地)
    2. 若仓库包含子模块,普通的克隆命令不会获取子模块内容,
  3. Git Submodule的操作
    1. git submodule update --init --recursive初始化并更新(所有子模块,包括嵌套子模块)
    2. git submodule update <子模块目录>更新指定的子模块
    3. git fetch <子模块 URL>查看子模块远程仓库的最新状态 git reset --hard <子模块版本>更新到指定版本
  4. 添加后,在项目就会出现.gitmodules文件
  5. 其他:#include <GLFW/glfw3.h>为什么要加GLFW,因为这是文件夹名

深度测试

  1. 深度测试 glEnable被启用 的时候,会模板测试运行之后运行,如果这个测试 通过了的话,**深度缓冲(0------1)**将会更新为新的深度值。如果失败了,片段将会被丢弃

  2. 深度缓冲(向一个窗口的矩形)由窗口系统自动创建的,通常和颜色缓冲有着一样的宽度和高度。会以16、24或32位float的形式精度储存它的深度值(gl_FragCoord的z分量)

  3. glViewport定义的窗口的大小,内建变量gl_FragCoord的x和y分量代表了 片段的 屏幕空间坐标(其中(0, 0)位于左下角),gl_FragCoord的z分量,它包含了片段真正的深度值

  4. 因为每次渲染时深度值有可能更新,每次渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲,否则你会仍在使用上一次渲染迭代中的写入深度值:

  5. 禁用深度缓冲的写入,使用一个只读的glDepthMask(GL_FALSE);

  6. glDepthFunc ()深度测试函数,修改深度测试中使用的比较运算符,来决定是否通过测试:每渲染一个片段,将深度值写进缓冲,将这个片段 的深度值与深度缓冲中深度值比较

  7. 深度值计算的精度(精度越高,深度值变化越明显):

    1. 观察空间中z值(近平面(Near)和远平面(Far)之间的任何值)变换到[0, 1]范围之间
    2. 线性:......
    3. 非线性:z值很小的时候提供非常高的精度,而在z值很远的时候提供更少的精度。根据1/z,随着z的增加,变化越来越慢。因为z越大,1/z越小,所以其余变量,也都变化为倒数
  8. 深度值可视化:

    1. (0------1)(暗------亮)FragColor = vec4(vec3(gl_FragCoord.z), 1.0);因为0,0,0颜色是黑色。
    2. 这时候注意到全都是白色,我们尝试极小心的靠近物体,才会看到一瞬间变为黑色,这是因为深度值是非线性的。
    3. 转化为线性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);
}
  1. 理解非线性深度转为线性深度的运算过程:
    1. *投影(3D到2D)矩阵的作用:视图坐标------裁剪坐标
    2. 过程1:视口坐标(视锥剔除:裁剪为视锥体)------裁剪坐标------标准化坐标NDC(映射到边长为1的正方形内部)(-1------1)------深度值(非线性变换(0------1))
    3. 注意:视口空间中,坐标是右手坐标系,NDC是左手坐标系,所以z值相反
    4. 理解投影矩阵:
    5. 视口坐标xeyeze(*投影矩阵)------裁剪坐标xcyczc(/w)------NDCxnynzn:
      1. 设视口坐标范围,l,r,b,t,-n,-f, 边界、 边界、底部顶部 边界和边界值
      2. 将某一个坐标xeyeze转为裁剪坐标:
      3. 首先xeye映射到近平面(从视图坐标和相机连线,使用相似三角形的比率计算)
      4. ze映射到-n近平面
      5. 转为裁剪坐标:
      6. 从 [L, R] 到 [-1, 1] 的 x 坐标范围,从 [b, t] 到 [-1, 1] 的 y 坐标范围,
      7. 从 [-n, -f] 到 [-1, 1] 的 z 坐标范围。
      8. 裁剪坐标w和z有关,投影矩阵最后一行为0,0,-1,0,从而w = -z
      9. 转为DNC:
      10. *投影矩阵后,裁剪坐标依旧是齐次坐标,但这时候的坐标的xy分量,已经转化为了近平面上,需要xc/wc, yc/wc,zc/wc,最终成为归一化设备坐标
    6. 我们已经知道了所有的运算,参考包括投影矩阵的所有条目,现在根据过程1,转为线性深度:
    7. 过程2:深度值------标准化坐标NDC------裁剪坐标------视口坐标------深度值(线性深度计算)
  2. 深度冲突:没有足够的精度来决定两个形状哪个在前面
    1. 不要把多个物体摆得太靠近,
    2. 将近平面(Near)设置远一些,将近平面设置太远将会导致近处的物体被裁剪掉
相关推荐
Caramel_biscuit18 分钟前
C++专业面试真题(1)学习
c++·学习·面试
卫卫周大胖;20 分钟前
【C++】多态(详解)
开发语言·c++
Java资深爱好者5 小时前
如何在std::map中查找元素
开发语言·c++
安步当歌8 小时前
【FFmpeg】av_write_trailer函数
c语言·c++·ffmpeg·视频编解码·video-codec
shuguang258009 小时前
C++ 函数高级——函数重载——基本语法
开发语言·c++·visualstudio
抽风侠9 小时前
C++左值右值
开发语言·c++
DogDaoDao9 小时前
LeetCode 算法:二叉树中的最大路径和 c++
c++·算法·leetcode·二叉树·二叉树路径
添砖JAVA的小墨10 小时前
C++ 如何解决回调地狱问题
c++
且行且知10 小时前
C++课程期末复习全集
开发语言·c++·算法
誰能久伴不乏10 小时前
Qt 绘图详解
开发语言·c++·qt