了解Depth_Test opengl

时间:2016-11-29 20:36:40

标签: c# opengl depth-testing

我是opengl的新手,我很难在opengl中学习深度测试。有人解释我的是什么DEPTH_TEST?我正在阅读我的文献,其中说:

  

"它可以隐藏被其他对象覆盖的对象   对象(深度隐藏)。如果没有启用,那么对象就是   早先画的,被遮盖了。"

我根本不理解第一句话。例如,如果我必须在某些quad前放置一些文字,其面积大于该文本,我该怎么做?如果DEPTH_TEST未启用,我只会先绘制quad,然后是文字,然后文字会在quad前面。但是DEPTH_TEST时的情况如何已启用?我不知道有什么内容,我不知道是否显示重要的顺序......这可能只是关于具有背面的三维物体,并且那些背面可以被遮盖吗?我什么时候应该使用DEPTH_TEST
先谢谢!:)

1 个答案:

答案 0 :(得分:4)

我不知道您使用的是哪种文献,但

  
    

它可以隐藏被其他对象覆盖的对象(隐藏深度)。如果没有启用,则会覆盖先前绘制的对象。

  

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

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

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

  

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

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

在GL中,每个片段都具有Z值。如果使用像文本这样的2D东西,你只需要在某些z = const平面上工作。但你可以选择任何你喜欢的飞机。

  

我应该何时使用DEPTH_TEST

每当您想要绘制原始图片时,您无法或者不想按照从前到后的顺序对场景中的所有图元进行排序,即摄像头和/或物体在移动的3D世界。此外,DEPTH_TEST可用于提高性能(已经绘制的表面后面的碎片不需要加阴影)。

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