经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
对 OpenGL 中 depth 概念的理解
来源:cnblogs  作者:皮斯卡略夫  时间:2020/12/14 17:12:45  对本文有异议

对 OpenGL 中 depth 概念的一些理解

首先,OpenGL Pipeline 有这些 transform:

Model View Projection -> Clipping -> [ Perspective Divide( a part of Projection) ] -> Viewport transform

在 Clipping 阶段中,不在用户定义的 view volume 中的点会被去掉,这个 view volume 的参数即 Projection Matrix 的参数,Perspective/Orthographic Projection 中设置的 left right bottom top near far.

Perspective Divide 实际上是 Projection 计算的一部分,只是这一部分已经 fix 在 pipeline 当中。在这一步变换之后,所有的坐标点都已经变换到 NDC 空间当中了。

Viewport transform: 将 NDC 空间的点变换到定义的 window space 中。 实际上当我们调用glViewport() 函数,我们只是定义了 viewport 的 2d 的范围大小。我们没有显式的提供 depth 的大小范围。但是我们知道,当 enable depth test 后,depth buffer 会有当前绘制的 depth 信息,而且我们也可以在 fragment shader 的 gl_FragCoord.z / gl_FragDepth 中获取到深度的具体数值。那么深度数值的范围是多少呢? glDepthRange() 提供了定义深度值的接口。如果不调用的话,默认的数值是:near 0, far 1. 在阴影的相关学习过程中会有将深度值直接绘制的尝试,那么在默认情况下,确实可以直接绘制,因为其范围正好和 shader 中的颜色的范围一致。但是这里需要注意的是,如果在 Projection 矩阵中设置了很大的前后区域,比如 near 1.0, far 1000.0 那么在上面的一系列变换之后,基本上所有的深度值都在 near 附近,也即将近0,则很难可视化,需要作额外的计算。

原文链接:http://www.cnblogs.com/psklf/p/14102193.html

 友情链接: NPS  问卷模板