问题标签 [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 回答
1182 浏览

c++ - Direct3D 11 深度模板/阿尔法混合问题

我一直在为游戏开发 3D 渲染器,直到现在它使用 DrawIndexed 首先渲染所有无纹理网格,然后渲染所有纹理网格。为了提高性能,我切换到 DrawIndexedInstanced 并使其首先渲染纹理网格,这揭示了我的 alpha 混合和/或深度检查的设置方式存在问题。以下图像应说明问题所在:

通过最前面的纹理顶部查看(首先渲染的纹理网格)

相同的视图,略微不同的角度(首先渲染无纹理网格)

前景和背景中是一排排带纹理的矩形网格,前景中的网格具有部分透明的网格。中间行是无纹理的网格,其透明度设置为 0.3f。当首先渲染带纹理的网格时,未纹理的网格会被前景中的透明网格遮挡。但是,当首先渲染无纹理网格时,它们会完全遮盖其后面的纹理网格,即使它们的透明度为 0.3f。当无纹理网格遮挡其他无纹理网格时,不会发生这种情况,Alpha 混合在这种情况下可以正常工作。

这是我设置光栅化状态、深度模板状态和深度模板视图的地方:

这就是我启用 alpha 混合的地方:

我知道给无纹理网格一个纯白色完全不透明的纹理会在某种程度上解决问题,但我怀疑深度测试有问题。

当我使用 D3D11_CREATE_DEVICE_DEBUG 标志创建设备时,它不会给我任何错误或警告。

Create 函数返回的所有 HRESULT 都是 S_OK。

提前致谢。

0 投票
1 回答
192 浏览

matlab - Matlab Kinect 深度成像

我正在使用 kinect 相机并尝试使用结合 RGB 和深度传感器的 ptCloud 方法显示真实的深度成像。但是,仅使用初始设置,我的图像就被毁容了,缺少相关信息,是否有办法改进这一点,以便捕获更多数据。我还附上了我的意思的图片。任何帮助都会非常感谢您! 实时视频图像数据

0 投票
0 回答
279 浏览

hlsl - HLSL 多通道几何着色器剔除问题

我正在开发一个运行两个通道的着色器:

  • 一个标准的顶点/像素着色器,它使用一些 alpha 混合来绘制原始对象
  • 细分网格并使其崩溃的几何着色器

然而,我的问题是第一遍的几何形状遮挡了第二遍的几何形状。即使原始几何体是完全透明的,它也会完全剔除第二遍中的任何几何体。 原始几何体是一个球体,正如您在此处看到的那样,它遮挡了几何着色器的结果

第一遍使用这种混合模式:

两个通道当前都使用这个 depthstencilstate:

两个通道的 Cullmode 都设置为 NONE。

有没有办法让两遍都使用深度测试,而第一遍不会遮挡第二遍?

如果需要,我可以将这些通道分成两个着色器,并在引擎中使用两个着色器渲染同一个对象,但我想知道是否可以只使用多个通道。

0 投票
1 回答
272 浏览

opengl - 渲染到帧缓冲区而不是屏幕时,OpenGL 深度排序在单个网格上失败

作为我的问题的一个简单演示,我试图将一个大而简单的网格渲染到一个纹理以供以后使用,但奇怪的是,这个网格的远离相机的部分显示在前面从特定角度观察时,更靠近相机的部分。尽管不可否认的事实是我毫无疑问地使用深度测试:

例如,我试图渲染一个以原点为中心的细分网格(在 xz 平面上),网格中间有一个平滑的“山丘”。

渲染到屏幕上时不会出现错误,网格看起来像这样(使用正交投影渲染,灰度颜色代表深度,即使从任何一侧查看网格也不会出现错误):

直接渲染到屏幕,即使网格旋转也不会出现错误

渲染到屏幕当然是通过确保帧缓冲区设置为 0 ( glBindFramebuffer(GL_FRAMEBUFFER, 0);) 来完成的,但是我需要将此场景渲染到另一个不是我的屏幕的帧缓冲区,以便将此渲染用作纹理。
所以我设置了另一个帧缓冲区和一个输出纹理,现在我将这个场景重新渲染到帧缓冲区(除了帧缓冲区和视口大小设置为匹配输出纹理之外,几乎没有任何变化)。为了演示我正在经历的错误,然后我将这个渲染的纹理渲染到一个平面上,然后显示在屏幕上。

当网格从正 x 轴旋转并围绕 y 轴旋转时,以 -0.5 π rad 和 0.5 π rad 之间的原点为中心,渲染的纹理看起来与渲染到屏幕时的结果完全相同,如图所示在上图中。

然而,当绕 y 轴的旋转大于 0.5 π rad 或小于 -0.5 π rad 时,靠近相机的山被渲染在远离相机的平面后面(事实上山是更接近相机可以通过查看颜色来证明,这代表了债务):

在此处输入图像描述

(哎呀,窗口上的标题错误,忽略它)

在围绕 y 轴旋转接近 0.5 π rad 或 -0.5 π rad 的边界区域中,场景看起来像这样。

在此处输入图像描述

(哎呀,窗口上的标题又错了,再次忽略它)

回顾一下。这种深度排序错误仅在使用帧缓冲区渲染到纹理时发生,并且仅在从特定角度查看对象时发生。当对象直接渲染到屏幕上时,不会发生错误。我的问题是:为什么会发生这种情况,以及我如何(如果有的话)避免它。

0 投票
0 回答
134 浏览

c++ - 如何用深度纹理填充 OpenGL 1 中的深度缓冲区?

我将可移动的 3d 对象和不可移动的 3d 分开。我可以为不可移动物体生成 2 个纹理:背景颜色纹理和背景深度纹理。我没有问题。两者的值都可以。我用灰色渐变纹理检查深度值。

我想用这些纹理在opengl中写入/填充颜色缓冲区和深度缓冲区,但深度不起作用(屏幕上的颜色缓冲区很好)。

我的目标是在相机不移动时永远不要重新计算不可移动的 3d 对象。

(rem:深度缓冲区位大小始终为 16 位)

这是我生成深度纹理的代码:

这是我填充颜色缓冲区的代码:

这是我的 Render::RenderImage() :它有效

这是我的 Render::RenderDepth() :它不起作用/我有一个深度 = 0.0f 的纹理,而不是使用每个纹素的深度。我只想更改深度缓冲区而不对颜色缓冲区执行任何操作 Render::RenderDepth() 类似于 Render::RenderImage() :我渲染 2 个三角形

0 投票
2 回答
1743 浏览

matlab - Matlab中的深度图像

我有一张从 Kinect V2 拍摄的深度图像,如下所示。我想在 Matlab 中提取任何特定坐标处的像素值 x 及其深度值。我在 Matlab 中使用了以下代码,但它给了我 16 位的值。但是,我不确定它是像素 x 的像素值还是深度值。

有人可以帮助我,如何在 Matlab 中提取像素和深度值?

深度图像

0 投票
2 回答
991 浏览

opengl - GTX 980 深度预通过后的 Z 战

我正在 OpenGL 中实现深度预通。在 Intel HD Graphics 5500 上,此代码可以正常工作,但在 Nvidia GeForce GTX 980 上却不行(下图显示了由此产生的 z-fighting)。我正在使用以下代码生成图像。(与问题无关的所有内容都被省略了。)

似乎 glDepthFunc 没有更改为GL_LEQUAL. 但是,当我单步执行 RenderDoc 中的 GL 调用时,glDepthFunc设置正确。

这听起来像驱动程序错误还是您有建议我可能做错了什么?当这是一个驱动程序错误时,我该如何实现深度预通?

Nvidia GeForce GTX 980 上的 z-fighting

0 投票
3 回答
2272 浏览

opengl - 深度测试后将两个单独的帧缓冲区合并到默认帧缓冲区

我有两个帧缓冲区,我正在渲染两个不同的对象。当我使用默认帧缓冲区时,我将两个对象渲染在同一个缓冲区上。

我希望这种行为在使用多个帧缓冲区时起作用!如何合并两个帧缓冲区并在顶部渲染获胜的片段(深度测试)!基本上就像 Photoshop 图层合并,但有深度测试!

我已经将单个帧缓冲区传输到默认帧缓冲区,但我不知道如何将两个帧缓冲区合并在一起!

注意:我对帧缓冲区有颜色和深度附件。

编辑:

好的。除了一件小事外,我几乎已经设置了渲染到四边形的工作。我的颜色缓冲区使用统一采样器正确发送到着色器,但我的深度值始终从深度缓冲区返回“0”。

这就是我在帧缓冲区中设置深度缓冲区的方式。

这就是我将统一采样器发送到着色器的方式。

这是我的着色器的外观:

0 投票
0 回答
114 浏览

c# - 在 OpenGL 中丢失深度测试精度

我编写 C# 代码以使用 OpenGL 使用正交投影在边缘上绘制由线条包围的立方体

表单加载时使用的代码

用于窗户油漆的代码

下图显示了深度测试精度是如何丢失的。 https://i.stack.imgur.com/NCVzj.jpg

当我更换

通过以下

然后,每件事都画得很好。但是我有一个 Z_coordinates 等于 600 的立方体,另一个 Z_coordinates 等于 0 的立方体需要使用 frustm 600

是否有另一种解决方案可以在不损失深度精度的情况下绘制所有对象?

0 投票
2 回答
698 浏览

c++ - 使用自定义帧缓冲区时深度测试不起作用

我正在整理帧缓冲区,并在我的场景中制作了一面镜子。除了深度测试外,它工作正常。被卡住试图让它工作。(当渲染到默认帧缓冲区时 - 深度测试工作正常)。将不胜感激任何帮助。这是代码: