QT+OpenGL深度测试

简介: 在前面的文章中,我们渲染了一个3D箱子,并且运用了深度缓冲来防止阻挡的面渲染到其他面的前面。现在大部分的GPU都提供一个叫做提前深度测试(Early Depth Testing)的硬件特性。提前深度测试允许深度测试在片段着色器之前运行。只要我们清楚一个片段永远不会是可见的(它在其他物体之后),我们就能提前丢弃这个片段。

QT+OpenGL深度测试

本篇完整工程见gitee:QtOpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主


深度缓冲

在前面的文章中,我们渲染了一个3D箱子,并且运用了深度缓冲来防止阻挡的面渲染到其他面的前面。


现在大部分的GPU都提供一个叫做提前深度测试(Early Depth Testing)的硬件特性。提前深度测试允许深度测试在片段着色器之前运行。只要我们清楚一个片段永远不会是可见的(它在其他物体之后),我们就能提前丢弃这个片段。


 ●  深度缓冲是由窗口系统自动创建的,他会以16、24或者32位float的形式存储它的深度值。


 ●  当深度测试被启用的时候,OpenGL会将一个片段的深度值与深度缓冲内容对比。如果测试通过,深度缓冲将会更新为新的深度值。如果深度测试失败,片段将会被丢弃。


 ●  深度缓冲是在片段着色器,以及模板测试运行之后在屏幕空间中运行的


 ●  GLSL内建变量gl_FragCoord, x和y分量代表了片段的屏幕空间坐标(其中(0, 0)位于左下角), z分量他包含了片段真正的深度值

// 开启深度测试
glEnable(GL_DEPTH_TEST);
// 深度函数
glDepthFunc(GL_LESS);
// 禁用深度缓冲
glDepthMask(GL_FALSE);
// 清除深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glDepthFunc:

函数 描述
GL_ALWAYS 永远通过深度测试
GL_NEVER 永远不通过深度测试
GL_LESS 在片段深度值小于缓冲的深度值时通过测试
GL_EQUAL 在片段深度值等于缓冲区的深度值时通过测试
GL_LEQUAL 在片段深度值小于等于缓冲区的深度值时通过测试
GL_GREATER 在片段深度值大于缓冲区的深度值时通过测试
GL_NOTEQUAL 在片段深度值不等于缓冲区的深度值时通过测试
GL_GEQUAL 在片段深度值大于等于缓冲区的深度值时通过测试

深度值精度

深度缓冲包含了一个介于0.0到1.0之间的深度值:


●  片段着色器中,gl_FragCoord向量的z值


屏幕截图 2023-08-03 155400.png


这里的near和far值是我们之前提供给投影矩阵设置可视平截头体的那个 nearfar 值。这个方程需要平截头体中的一个z值,并将它变换到了[0, 1]的范围中


然而,在实践中是几乎永远不会使用这样的线性深度缓冲(Linear Depth Buffer)的。要想有正确的投影性质,需要使用一个非线性的深度方程,它是与 1/z 成正比的。


屏幕截图 2023-08-03 155407.png

#version 330 core
out vec4 FragColor;
float near = 0.1;
float far  = 100.0;
float LinearizeDepth(float depth)
{
    float z = depth * 2.0 - 1.0; 
    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);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0vDyX3x-1676882895765)(C:\Users\89869\Desktop\桌面文件\LearnC++\learn-c\QT+OpenGL\深度测试.png)]

目录
相关文章
|
7月前
QT4.7版本的OPENGL的3D旋转模型例子
QT4.7版本的OPENGL的3D旋转模型例子
135 0
|
7月前
|
存储 C语言 Windows
音视频使用qt测试ffmpeg接口时无法运行
音视频使用qt测试ffmpeg接口时无法运行
125 0
QT+OpenGL鼠标操作和模型控制
光线追踪法 从鼠标投射 3D 射线, 通过摄像机,进入场景,然后检查该光线是否与某个对象相交。
380 0
|
4月前
|
Linux
关于linux的qt发布(linuxdeployqt)中opengl版本过高的解决
关于linux的qt发布(linuxdeployqt)中opengl版本过高的解决
|
5月前
|
监控 Python
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
|
异构计算
QT+OpenGL高级数据和高级GLSL
● OpenGL中的缓冲区 对象管理特定的GPU内存 ● 在将缓冲区绑定到特定的缓冲区目标时候赋予它意义 ● OpenGL在内部会保存每个目标(缓冲区)的引用,并且根据目标以不同的方式处理缓冲区。
162 0
QT+OpenGL高级数据和高级GLSL
|
7月前
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
1045 4
|
7月前
|
Linux API iOS开发
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
232 0
|
7月前
Qt+OpenGL 打砖块游戏
Qt+OpenGL 打砖块游戏
90 0
|
7月前
|
数据可视化 API vr&ar
qt“五彩斑斓“ opengl
qt“五彩斑斓“ opengl
104 0