问题标签 [depth-buffer]

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 回答
1665 浏览

objective-c - 使用具有不同分辨率的深度和颜色缓冲区(子采样深度缓冲区)

我想使用子采样深度缓冲区来提高程序的性能。就我而言,是否存在伪影或几何弹出并不重要。

我已经像这样设置了我的帧缓冲区:

但是,现在,根据文档glCheckFramebufferStatus(GL_FRAMEBUFFER),返回代表“并非所有附加图像都具有相同的宽度和高度” 。GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS

有一篇名为“ Full-3D Edge Tracking with a Particle Filter ”的研究论文在第 3.5 节中描述了他们实际上使用子采样深度缓冲区来提高其应用程序的性能。

子采样深度缓冲区:沿图像边缘的相邻像素密切相关,以至于测试每个单独的边缘像素是多余的。对于单假设跟踪器,通常将样本点沿边缘分散 10-20 个像素的距离。仅对每第 n 个边缘像素进行采样也会降低所需的图形带宽,因此仅对每 4 个像素进行采样。此处不是显式绘制点画线,而是通过使用子采样深度缓冲区(160 x 120) 来实现,因为这进一步实现了用于清除和填充深度缓冲区的带宽减少。然而,这也意味着隐藏线的去除可能不准确到大约四个像素。除此之外,系统的准确性不受影响。

唯一明显的解决方法是

  • 使用片段着色器程序对先前渲染的深度缓冲区执行查找以手动应用深度检查。
  • 以较低的分辨率渲染深度缓冲区,然后将其重新采样到较大的分辨率,然后像以前一样使用它。

这两种方法听起来都不是最有效的想法。实现子采样深度缓冲区的最简洁方法是什么?

0 投票
2 回答
429 浏览

iphone - 使用 2D iPhone OpenGL ES 1.1 应用程序,我如何让我的深度缓冲区为纹理工作?

我正在制作一个 2D 视频游戏。现在我没有那么多精灵,一个没有深度缓冲区的纹理可以正常工作。但是当我扩展到多个纹理时,我想使用深度缓冲区,这样我就不必在同一个纹理上进行多次传递,这样我就不必根据任何深度约束来组织我的纹理。

当我尝试让深度缓冲区工作时,我只能得到一个具有正确清晰颜色的空白屏幕。我将在没有深度缓冲区的情况下解释我的工作设置,并列出升级到深度缓冲区的问题:

  • 现在我的顶点只有位置(x,y)和纹理(x,y)坐标。没有别的了。没有照明,没有法线,没有颜色等。我必须在这里进行的唯一升级是将 az coord 添加到我的位置是否正确?

  • 现在我正在使用:

这适用于没有深度缓冲区。但是当我添加深度缓冲区时,我想我需要更改近处和远处的值。我应该把它们改成什么?

  • 现在对于我的 glTexImage2D() 我正在使用:

当我添加深度缓冲区时,我是否必须更改任何这些参数?

  • 在调用 时glClearDepthf();,我应该使用在调用 glOrthof() 时使用的近值还是远值之一?哪一个?
0 投票
1 回答
3936 浏览

opengl - 使用带有 GL_LINES 的深度缓冲区

我想绘制移除隐藏边缘的对象的边缘。我想应用的想法是首先将对象的面渲染到深度缓冲区,然后在第二遍中绘制启用深度测试的边缘。

因为不是所有的三角形边都应该可见,所以边是分开存储的(简单的例子:在一个立方体中,对角边不应该是可见的,尽管它们在那里是因为四边形被渲染为两个三角形)。因此,使用 绘制面,使用单独的顶点缓冲区GL_TRIANGLES绘制边缘。GL_LINES

问题是隐藏边缘部分显示在此设置中,可见边缘部分隐藏。我怎样才能达到正确的结果?

  • 没有深度测试:

    无需深度测试

  • 深度测试:

    通过深度测试

  • 渲染到深度缓冲区的面:

    仅限面孔

我使用带有附加颜色和深度缓冲区的帧缓冲区来绘制我的对象。

此设置可以正常工作。我绘制我的对象如下:

使用的着色器只是一个标准的模型-视图-投影顶点着色器,以及一个为所有片段输出白色的片段着色器。

0 投票
1 回答
886 浏览

optimization - 有效地将 Kinect 深度与 OpenGL 深度进行比较

背景:

此问题与对象的 3D 跟踪有关。

我的系统将已知参数(X、Y、Z)的对象/样本投影到 OpenGL,并尝试与从 Kinect 传感器获得的图像和深度信息相匹配,以推断对象的 3D 位置。

问题:

Kinect 深度-> 进程-> 以毫米为单位的值

OpenGL->depth buffer-> 0-1之间的值(在near和far之间非线性映射)

虽然我可以使用http://www.songho.ca/opengl/gl_projectionmatrix.html中提到的方法从 OpenGL 中恢复 Z 值,但这会产生非常缓慢的性能。

我确信这是常见的问题,所以我希望一定有一些解决方案存在。

问题:

从OpenGL恢复眼睛Z坐标的有效方法?

或者有没有其他方法可以解决上述问题?

0 投票
1 回答
574 浏览

xna - XNA 3.1 在清除之前保留深度缓冲区

我试图通过在切换渲染目标之前从深度缓冲区复制 IDirect3DSurface9 来解决 XNA 3.1 在切换渲染目标时自动清除深度缓冲区的问题,然后在稍后恢复深度缓冲区。

在代码中,getDepthBuffer 方法是一个指向 IDirect3DDevice9 GetDepthStencilBuffer 函数的指针。指向该方法的指针似乎是正确的,但是当我尝试获取 IDirect3DSurface9 指针时,它返回异常(0x8876086C - D3DERR_INVALIDCALL)。surfacePtr 指针最终指向 0x00000000。

关于为什么它不起作用的任何想法?以及如何解决它的任何想法?

继承人的代码:

0 投票
2 回答
1989 浏览

opengl-es - 将深度缓冲区渲染到纹理

着色器相当新,所以如果我在这里做一些愚蠢的事情,请多多包涵。:)

我正在尝试在 iOS 上使用 opengl ES 2.0 将场景的深度缓冲区渲染为纹理,但除非模型在显示器上显示的多边形密度相对较高,否则我似乎无法获得完全准确的结果。

因此,例如,如果我渲染一个仅包含四个顶点的大平面,我会得到非常不准确的结果,但是如果我细分这个平面,每个细分的结果都会变得更准确,最终我会得到一个正确渲染的深度缓冲区。

这让我想起了很多关于仿射与透视投影纹理映射问题,我想我需要以某种方式使用“.w”组件来解决这个问题。但我认为“变化”的变量应该已经考虑到这一点,所以我在这里有点不知所措。

这是我的顶点和片段着色器:

请注意,这个着色器被简化了很多只是为了突出我正在使用的方法。尽管在大多数情况下肉眼看起来效果很好,但实际上我正在渲染为 32 位纹理(通过将浮点数打包到 ARGB 中),并且我需要非常高的精度以供以后处理,否则我会得到明显的伪影。

我可以通过增加多边形数量来实现相当高的精度,但这会使我的帧率下降很多,那么,有没有更好的方法?

0 投票
3 回答
8824 浏览

c++ - Directx 11 深度测试不起作用

我无法让我的程序正确选择要放在前面的模型。我完全遵循了 MSDN 代码。我的代码似乎在 DrawIndexed 的特定调用中正确绘制了所有多边形,但每个后续调用似乎都会导致模型按照它们的绘制顺序绘制,而不是基于它们是否更靠近屏幕。

这是我初始化 Direct3d 的代码:

这是我的渲染代码:

我尝试过广泛搜索,并遵循了我能找到的每一个教程。没有什么能解决它。

在球体的情况下,如果从一侧看,深度似乎是正确的,但从另一侧看则不然。

任何帮助,将不胜感激。谢谢。

0 投票
1 回答
667 浏览

ios - OpenGLES 2.0(GLKit,iPhone):多边形部分遮盖了线框线

我正在尝试为 iOS 创建一个 3D 函数绘图仪。我已经成功地使用三角形条来渲染图形,并且还实现了通过线条绘制线框。但是,如果我使用 24 位(或 16 位无关紧要)深度缓冲区同时渲染两者,则线条会被多边形部分遮挡,使它们看起来非常细或完全消失。关闭 4xMSAA 并不能解决问题。有关示例,请参见下图。

部分被遮挡的线条示例

只画线条就可以了——线条的粗细恰到好处。如果我为线条禁用深度缓冲,它们也会正确绘制,但它们当然会出现在所有多边形之上(即确实被多边形隐藏的线条)。我还尝试降低多边形的透明度,但无济于事。稍微增加线条的 y 坐标会使它看起来更好,只要你从上面看它们,这样它们就确实在多边形的前面。

为了获得最佳性能,我在渲染之前将所有顶点数据和索引静态存储到顶点数组中。因此,我的渲染循环很短:

如何同时正确显示多边形和线框?我还想过只是将线条移动到更靠近相机现在恰好所在的位置,但我不知道如何在 OpenGL ES 中做到这一点,而且我不确定它是否会影响性能,因为这种转变取决于相机的当前位置。是否可以在绘制线条之前对线条动态应用转换?

0 投票
1 回答
753 浏览

opengl - 深度缓冲区大小是否与视口大小相同?

如果我表演

这是否使我的深度缓冲区大小为 SCREEN_SIZE x SCREEN_SIZE?

0 投票
2 回答
2747 浏览

opengl - 禁用从 glsl 写入深度缓冲区

所有几何图形都存储在一个 VBO 中(透明 + 不透明)。我无法对几何进行排序。如何在不丢失数据颜色的情况下禁用从 glsl 写入深度缓冲区?