slo*_*mil 1 c# opengl depth-testing
我是 opengl 的新手,我很难学习 opengl 中的深度测试。有人可以解释一下什么是吗DEPTH_TEST?我正在阅读我的文献,其中写道:
“它可以隐藏被其他对象覆盖的对象(按深度隐藏)。如果未启用,则先前绘制的对象将被覆盖。”
我根本不明白第一句话。例如,如果我必须在一些文本前面放置一些文本quad,该文本的面积比该文本大,我该怎么做?如果DEPTH_TEST未启用,我会先绘制那个quad,然后是文本,然后文本会在它前面quad..但是何时启DEPTH_TEST用?我不知道其中涵盖了什么,我不知道显示顺序是否重要......这可能只是关于有背面的 3D 物体,并且这些背面可以被覆盖?我应该什么时候使用DEPTH_TEST?
提前致谢!:)
我不知道你用的是什么文献,但是
它可以隐藏被其他对象覆盖的对象(按深度隐藏)。如果未启用,则先前绘制的对象将被覆盖。
这是一个非常糟糕的解释。深度测试根本与对象无关。它是关于分别决定每个屏幕像素的可见性。
基本前提是:如果在 3D 空间中处理不透明物体,靠近相机的表面将遮挡较远的表面。由于我们确实将对象转换为相对于相机的某个坐标系,因此我们通常将所得的 Z 值解释为深度值。(X 和 Y 是水平轴和垂直轴,Z 点“进入您的显示器”)。
深度测试的工作原理是存储每个屏幕像素的深度值(在所谓的深度缓冲区或 Z 缓冲区中),并且在绘制到新像素之前,首先检查其关联的 Z 值是否低于缓冲区中已有的值。如果不是,则丢弃该片段而不将其写入帧缓冲区。如果是,则颜色和深度缓冲区将使用该片段的数据进行更新(覆盖之前在该特定像素处绘制的内容)。该算法通常称为Z 缓冲。
这可能只是关于有背面的 3D 物体,并且这些背面可以被覆盖吗?
不,背面与此没有太大关系。(虽然深度测试也会处理背面先于正面绘制的情况,但对于这种情况,启用背面剔除效果更好)。
In the GL, every fragment will have a Z value. If you work with 2D things like text, you just work in some z=const plane. But you can chose any plane you like.
When should I use
DEPTH_TESTanyway?
Whenever you want to draw primitives where you can't or don't want to sort all primitives in your scene in back-to-front order, i.e a 3D world where camera and/or objects are moving. Also, the DEPTH_TEST can be used to improve performance (fragments which lie behind already drawn surfaces don't need to be shaded).
Also note that you can switch the test on an off at any time, so you can draw some 3D scene with Z-Buffering, and disable it to draw some text overlay without having to care about its Z coordinates.