欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > OpenGL3.3_C++_Windows(11)

OpenGL3.3_C++_Windows(11)

2024/10/24 2:03:09 来源:https://blog.csdn.net/sengyongan/article/details/139755100  浏览:    关键词: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:
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)设置远一些,将近平面设置太远将会导致近处的物体被裁剪掉

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com