【问题标题】:Understanding Depth_Test opengl了解 Depth_Test opengl
【发布时间】:2017-04-14 00:08:19
【问题描述】:

我是 opengl 的新手,我很难在 opengl 中学习深度测试。有人可以解释一下DEPTH_TEST 是什么吗?我正在阅读我的文献,上面写着:

"它可以隐藏被其他对象覆盖的对象 对象(按深度隐藏)。如果未启用,则为对象 早点画的,被遮住了。”

我根本听不懂第一句话。例如,如果我必须在一些 quad 前面放置一些文本,它的面积比那个文本更大,我该怎么做?如果 DEPTH_TEST没有启用,我会先画quad,然后是文字,然后文字会在quad前面。但是当DEPTH_TEST启用时如何?我不知道有什么覆盖,我不知道显示顺序是否重要...这可能只是关于具有背面的 3d 对象,并且可以覆盖这些背面?我什么时候应该使用DEPTH_TEST
提前致谢!:)

【问题讨论】:

    标签: c# opengl depth-testing


    【解决方案1】:

    我不知道你用的是什么文献,但是

    启用隐藏被其他对象覆盖的对象(按深度隐藏)。如果未启用,则覆盖之前绘制的对象。

    是一个非常糟糕的解释。深度测试根本不是关于对象。它是关于分别决定每个屏幕像素的可见性。

    基本前提是:如果你在 3D 空间中处理不透明的物体,靠近相机的表面会遮挡更远的表面。由于我们确实将对象转换为相对于相机的某个坐标系,因此我们通常将生成的 Z 值解释为 depth 值。 (X 和 Y 是水平和垂直轴,Z 指向“进入你的显示器”)。

    深度测试的工作原理是为每个屏幕像素存储一个深度值(在所谓的深度缓冲区或 Z 缓冲区中),在绘制到新像素之前,首先检查它的关联 Z 值是否低于已经在缓冲区中。如果不是,则丢弃该片段而不将其写入帧缓冲区。如果是,颜色和深度缓冲区将使用该片段的数据进行更新(覆盖之前绘制的内容 - 在此特定像素处)。该算法通常称为Z-Buffering

    这可能只有大约有背面的 3d 对象,并且这些背面可以被覆盖吗?

    不,背面与此无关。 (虽然深度测试也会处理背面先于正面绘制的情况,但启用 backface culling 对于这种情况会更好。

    在 GL 中,每个片段都有一个 Z 值。如果您使用诸如文本之类的 2D 内容,您只需在某个 z=const 平面中工作。但是你可以选择任何你喜欢的飞机。

    我什么时候应该使用DEPTH_TEST

    当您想绘制不能或不想按从后到前顺序对场景中的所有图元进行排序的图元时,即相机和/或物体正在移动的 3D 世界。此外,DEPTH_TEST 可用于提高性能(位于已绘制表面后面的片段不需要着色)。

    另外请注意,您可以随时关闭测试,因此您可以使用 Z-Buffering 绘制一些 3D 场景,并禁用它以绘制一些文本覆盖,而无需关心其 Z 坐标。

    【讨论】:

    • 非常感谢您的解释,我想我现在明白了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2011-08-10
    • 2021-06-03
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多