问题标签 [depth-testing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
106 浏览

opengl-es - 在 OpenGL 中执行每个片段的 DEPTH_TEST

我可以使用 OpenGL 在 OpenGL 中打开/关闭深度测试,glEnable( GL_DEPTH_TEST ); 但这会打开/关闭整个绘图调用的测试。

我想在每个片段的基础上控制测试。

这是为了达到以下效果:在棋盘模式中,图元的一半像素可能被遮挡,但另一半总是被绘制,即使帧缓冲区中存在更接近于相机。

为了说明,请看这个例子,其中只有一半的金字塔像素可能被前面的框遮挡。

请注意,首先绘制红色框,并且在绘制绿色金字塔时已经在帧缓冲区中。

另请注意:我将最后绘制带有特殊深度测试的对象,因此不会发生先绘制红色框的情况。

出于我的目的,以这种方式绘制的所有对象都是凸的,并且永远不会遮挡自身。

效果图

我知道如何在我的片段着色器中获得棋盘图案:

但就我而言,我不想在每个片段的基础上完全丢弃,我只想在每个片段的基础上切换深度测试。

我的目标是 OpenGL-ES 3.0。

0 投票
1 回答
341 浏览

opengl - OpenGL优化天空盒渲染

我正在学习如何使用来自以下资源的立方体贴图绘制天空盒。

我已经到了他谈到我们如何优化天空盒渲染的部分。我明白了,而不是先渲染天空盒,这将导致width*height计算视口片段然后只被其他对象透支,最好最后绘制它并1.0f通过分配gl_Position天空盒来伪造它的深度值由于透视分割,顶点着色器gl_Position = pos.xyww基本上使每个gl_FragCoord.z等于。1.0f

现在我们得到一个天空盒,它的每个片段都具有最大深度值,1.0f他将深度函数更改为GL_LEQUAL而不是GL_LESS.

这是我有点困惑的地方。
如果我们最后渲染天空盒并且它的深度值等于1.0f为什么我们需要将深度函数更改为GL_LEQUAL?将其设置为是否足够,GL_LESS因为如果我们渲染场景中的所有其他对象,它的深度值可能会小于1.0f所以它会将其值写入z-buffer小于的值1.0f。现在,如果我们将天空盒的深度函数设置为GL_LESS它,那么它只会传递深度值小于实际值的片段,z-buffer这可能只会传递其他对象没有覆盖的片段,那么为什么我们需要GL_LEQUAL?

0 投票
1 回答
218 浏览

opengl - 针对特定深度值强制深度测试,而不是片段的实际深度

我想通过使用glDepthFunc(GL_EQUAL)和写入深度为1.0(最高和默认值)的每个像素,在写入深度缓冲区的所有内容后面绘制一些图元

然而,为了让它工作,我必须忽略我的图元上计算的 Z 深度,迫使它们像1.0对所有图元一样进行测试。

1.0无论在顶点着色器中计算的实际 z深度如何,强制特定绘制中的所有片段测试为具有 z 深度的最简单方法是什么?

0 投票
1 回答
65 浏览

android - 如何测量手机与被摄物体之间的距离?

我正在尝试为要将 2D 照片转换为 3D 对象的应用程序获取移动设备和对象之间的距离,我有以下疑问:

  1. 有没有办法获取手机镜头与被摄物体之间的距离?
  2. 我们可以通过类似的方式确定手机内部镜头的焦距,我们是否在手机内部安装了深度传感器?
  3. 深度传感器是否存在于所有手机中?

可以使用手机内部的传感器获得手机的方向和方位等信息。如果没有深度传感器,如何使用手机本身测量距离?

0 投票
1 回答
816 浏览

c++ - 如何在 OpenGL 上使立方体面不透明?

我正在编写一个程序来在 OpenGL 上绘制一个立方体并在鼠标点击时连续旋转它。在特定角度,我能够看穿立方体(透明)。我启用了深度测试,所以我不知道为什么会这样。我不确定我是否正确启用了它。

在这张图片中,隐藏的面孔仍然可见

0 投票
1 回答
150 浏览

c++ - 图形到图形深度依赖性,深度缓冲区被破坏

我正在尝试执行以下操作:使用渲染通道 1,渲染到附件集 S。

进行渲染通道 2,再次渲染到附件集 S。

在官方的Khronos github中有一对一的解释如何做到这一点:

在图形到图形依赖项下。但是,尝试实现与示例中相同的代码是行不通的。

这就是我所看到的:

在此处输入图像描述

这是我应该看到的:

图形到图形深度依赖性,深度缓冲区被破坏。

我认为目前正在发生的是深度缓冲区没有正确同步,因此深度测试无法正常工作。我创建了两个渲染通道,如下所示:

我已经阅读并重新阅读了该示例,并尝试使我的代码尽可能与它相同,但是唉,问题仍然存在。我创建工作图像的方式是让两个渲染发生在同一个渲染通道下,但我不想那样做。

0 投票
1 回答
296 浏览

javascript - 如何检查Javascript中每个对象字段的深度

我的 React Native 应用程序中有一个导航功能,它将以开发人员模式传递给它的所有参数输出到控制台,有时我向参数发送了一个大存储并且它无法输出。得到关于循环对象引用的错误,因为对象很深。因此,我决定创建一个函数来检查对象的所有字段,并依赖它将信息输出到控制台,例如,如果对象字段的深度超过 1 级。

在不是深对象的情况下,它必须像这样返回对象本身:

对于深度对象,它必须返回所有非深度字段并加上对象深度字段的标志:

你能推荐我最好的方法吗?

0 投票
0 回答
43 浏览

opengl - 为什么我的场景看起来深度测试已禁用?

我渲染了简单的盒子,它显示出混乱的深度。

在此处输入图像描述

它应该看起来像这样(请忽略角度和比例的差异):

在此处输入图像描述

我已经确认使用 apitrace 启用了深度测试。这是该场景的 apitrace 的 GL_DEPTH_* 状态:

在此处输入图像描述

我的场景有什么问题?

我可以为此帧提供任何 OpenGL 状态值,但完整列表太长无法捕获,因此我仅在此处上传非默认状态。

如果您需要更多信息,请告诉我。

在此处输入图像描述

编辑:GL_DRAW_FRAMEBUFFER 状态

在此处输入图像描述

编辑:我发现错误场景中的片段(下图中的上图)具有大约 0.01923 的固定深度值。另一方面,右侧场景中片段的深度值(下图)在 0.9(0.8~1.0)左右变化。

在此处输入图像描述

0 投票
1 回答
31 浏览

c++ - 单个着色器中的 N 个深度图纹理

我有一个着色器 1 深度贴图纹理附加到它。

是否可以在一个着色器中将超过 1 个深度纹理附加到不同LightSpaceMatrix的 es?

或者我应该在不同的帧缓冲区中进行吗?

0 投票
1 回答
301 浏览

c++ - openGL何时以及如何计算F_depth(深度值)

这意味着此时投影已经完成。这篇文章给了我们OpenGL使用的投影矩阵,影响一个点z坐标的因素是行:

请注意,计算此矩阵是为了将“金字塔”平截头体制成一个单位立方体。这意味着在应用此矩阵后,z 坐标也已映射到 [0,1]。

然后,深度值精度一章的作者告诉我们:这些视图空间中的 z 值可以是截锥体近平面和远平面之间的任何值,我们需要一些方法将它们转换为 [0,1]。问题是为什么在这一点上,当我们在应用投影矩阵时已经映射了它。

此外,他说:像这样的线性深度缓冲区: F_depth=z-near/(far-near)从未使用过,为了正确的投影属性,使用非线性深度方程:

但是,正如我们所见,z 在范围内使用:

这似乎是线性的。

所有这些自相矛盾的陈述让我非常困惑何时计算和比较片段的深度,以及实际用于计算它的方程是什么。在我的理解中,在应用 OpenGL 投影矩阵之后应该不再计算深度,但是在阅读完这篇文章后我真的很困惑。任何澄清?