我是opengl的新手,在opengl中学习深度测试有困难。有人可以解释我什么是DEPTH_TEST
吗?我正在阅读我的文献,其中说:
"它可以隐藏被其他物体覆盖的物体。 对象(按深度隐藏)。如果未启用,则对象 早先画的,被覆盖了。
我完全不明白第一句话。例如,如果我必须在某个quad
前面放置一些文本,该文本的面积比该文本大,我该怎么做?如果未启用DEPTH_TEST
,我将首先绘制该quad
,然后绘制文本,然后文本将位于该quad
的前面。但是当启用DEPTH_TEST
时如何?我不知道那里涵盖了什么,我不知道显示顺序是否重要......这是否可能只有具有背面的3d对象,并且可以覆盖这些背面?我应该什么时候使用DEPTH_TEST
?
提前感谢!:)
我不知道你在用什么文献,但是
它可以隐藏被其他对象覆盖的对象(按深度隐藏)。如果未启用,则会覆盖之前绘制的对象。
是一个非常糟糕的解释。深度测试根本不是关于物体的。这是关于分别确定每个屏幕像素的可见性。
基本前提是:如果在3D空间中处理不透明物体,则靠近相机的表面将遮挡较远的表面。由于我们确实将对象转换为相对于相机的某个坐标帧,因此我们通常会将生成的 Z 值解释为深度值。(X 和 Y 是水平轴和垂直轴,Z 指向"进入显示器")。
深度测试的工作原理是存储每个屏幕像素的深度值(在所谓的深度缓冲区或 Z 缓冲区中),在绘制到新像素之前,首先检查其关联的 Z 值是否低于缓冲区中已有的值。否则,将丢弃片段而不写入帧缓冲区。如果是,颜色和深度缓冲区将使用该片段的数据进行更新(覆盖之前绘制的内容 - 在此特定像素处)。该算法通常称为 Z 缓冲。
这是否可能只有具有背面的3d对象,并且可以覆盖这些背面?
不,背面与此没有太大关系。(虽然深度测试还将处理在正面之前绘制背面的情况,但在这种情况下启用背面剔除甚至更好)。
在 GL 中,每个片段都有一个 Z 值。如果你使用文本等 2D 东西,你只需要在某个 z=const 平面上工作。但是你可以选择任何你喜欢的飞机。
我应该什么时候使用
DEPTH_TEST
?
每当您想要绘制无法或不想按从后到前顺序对场景中所有基元进行排序的基元时,即摄像机和/或对象移动的 3D 世界。此外,DEPTH_TEST
可用于提高性能(位于已绘制表面后面的碎片不需要着色)。
另请注意,您可以随时关闭测试,因此您可以使用 Z 缓冲绘制一些 3D 场景,并禁用它以绘制一些文本叠加,而不必关心其 Z 坐标。