1

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

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

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

4

1 回答 1

5

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

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

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

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

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

那可能只是关于有背面的 3d 对象,并且这些背面可以被覆盖吗?

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

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

我应该什么时候使用DEPTH_TEST

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

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

于 2016-11-29T21:06:38.373 回答