• 对 OpenGL 中 depth 概念的理解


    对 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,则很难可视化,需要作额外的计算。

  • 相关阅读:
    通向全栈之路——(4)nginx反向代理配置
    通向全栈之路——(3)node环境搭建
    通向全栈之路——(2)服务器安全设置
    通向全栈之路——(1)服务器新增用户及授权
    window.location.href跳转至空白页
    webpack 1.x 学习总结
    win7下使用apache ab 比较测试node与 tomcat
    Enum,Int,String的互相转换
    读写appSettings配置节方法
    SC命令
  • 原文地址:https://www.cnblogs.com/psklf/p/14102193.html
Copyright © 2020-2023  润新知