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

opengl - 为什么 glPolygonOffset 与多边形的斜率有关

我正在使用 OpenGL 进行阴影映射。将深度与阴影贴图进行比较时会出现 z-fighting 问题。我可以使用 glPolygonOffset 解决问题。我知道这个功能有助于推动(或拉动)多边形一点点,以便解决 z-fighting 问题。但我对函数 glPolygonOffset 有疑问。我不清楚为什么多边形的斜率与偏移量有关。

这里

需要使用 factor 参数来确保接近观察者边缘的填充图元的正确结果。在这种情况下,由两个共面图元生成的同一像素的 Z 值之间的差异可能与 X 或 Y 中的最大 Z 斜率一样大。这个 Z 斜率对于接近边缘的图元来说会很大,并且几乎不存在对于正面基元。因子参数允许您将这种类型的变量差异添加到生成的深度偏移中。

在这里我不知道为什么“两个共面图元生成的同一像素的 Z 值之间的差异可以与 X 或 Y 中的最大 Z 斜率一样大”。

0 投票
2 回答
2875 浏览

opengl - 无法在 OpenGL 中进行深度测试

我使用SFML创建窗口。

在这个屏幕截图中,立方体应该在金字塔的后面,但它不起作用。 截屏

这是我使用的最小代码:

我试过不同的深度函数,GL_LESS,GL_EQUAL,我都试过了。同样在不同的地方启用和禁用深度测试,似乎没有任何效果。

我正在运行 Mac OS X 10.7 ( Lion ),不确定这是否重要,尽管在升级之前我似乎对这些事情没有任何问题。

0 投票
2 回答
11976 浏览

c++ - 为什么 GL_LEQUAL 推荐用于 GL 深度函数(为什么它对我不起作用)?

GL wiki上,他们建议使用 GL_LEQUAL 作为深度函数。此外,深度函数默认为 GL_LESS。当我使用这些功能中的任何一个时,我都会得到奇怪的结果。在这张图片中,红色方块应该在蓝色方块的前面(两个方块大小相同): 与 GL_LESS

但是,如果我使用glClearDepth(0.0)and then glDepthFunc(GL_GREATER),运行其他未更改的程序,我会得到: 与 GL_GREATER

再想一想,GL_LESS 会给出它所做的结果是有道理的:如果传入的深度值小于存储的深度值,则写入片段。

如果我将相机定位在(1, 0, 0)并看向(0, 0, 0)我希望一个对象位于(0.5, 0, 0)的一个对象前面(0, 0, 0)。使用 GL_LESS 的对象不会(0, 0, 0)是其片段被写入的对象吗?

编辑:尼科尔,感谢您提到投影矩阵。好像设置不正确。我在 arcsynthesis.org 上关注了你的教程一段时间,并将代码调整到我自己的项目中,但我偏离了你的投影矩阵,并使用 glFrustum 手册页上描述的数学来实现我自己的该函数版本,然后使用 NeHe 的 gluPerspective替换以替换 gluPerspective。我不知道为什么替换不起作用,因为我的矩阵数学是正确的(我已经对照各种在线计算器进行了检查)。使用您的矩阵,我使用 GL_LESS 得到了正确的结果。

0 投票
0 回答
205 浏览

opengl-es - OpenGL中具有alpha值的纹理深度

我正在为 Android 开发 OpenGL ES 1.x 中的应用程序,并且在使用 alpha 蒙版进行多边形的深度测试时遇到问题。如何使程序仅在 alpha!=0 的值中计算深度测试?我试过了glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.1f);,但它没有改变任何东西,我不明白为什么。

提前致谢。

0 投票
3 回答
2837 浏览

c++ - 在 OpenGL 中使用具有 Alpha 的纹理渲染 3D 模型

因此,我试图找出在 OpenGL 中渲染 3D 模型的最佳方法,因为它的某些纹理具有 alpha 通道。

当我启用深度缓冲区并开始绘制 3D 模型中的所有三角形时,如果它绘制了一个位于模型中另一个三角形前面的三角形,它在到达它时根本不会渲染后三角形。问题是当前面的三角形具有 alpha 透明度时,应该可以看到后面的三角形,但后面的三角形仍然没有渲染。

禁用深度缓冲区消除了这个问题,但会产生一个明显的问题,即如果三角形不透明,那么如果在之后渲染,它仍然会在其后面渲染三角形。

例如,我正在尝试渲染一棵松树,它基本上是一些相互堆叠的具有透明底座的锥体。下图显示了启用深度缓冲区时出现的问题:

启用深度缓冲区

您可以看到仍然可以看到透明三角形的轮廓。

下图显示了禁用深度缓冲区时的样子。

深度缓冲区已禁用

在这里,您可以看到树后面的一些三角形是如何在树的其余部分前面渲染的。

任何想法如何解决这个问题,并正确渲染松树?

PS我正在使用着色器来渲染一切。

0 投票
1 回答
3642 浏览

android - OpenGLES 1.1 with FrameBuffer / ColorBuffer / DepthBuffer for Android with NDK r7b

在阅读了 NDK 文档和我所有关于 OpenGLES 的书之后,我碰壁了。我正在尝试将我的 iOS OpenGLES 设置复制到 Android NDK R7 及更高版本,主要是为了获取我之前在编码时忽略的深度缓冲区。

问题是当我启用如下所示的颜色缓冲区时,我会丢失某些对象上的纹理,而当我将对象发送到背景中时深度缓冲区不起作用。

我正在使用 OGLES 1.1 FFP 和 NDK R7 或更高版本

这是我的初始化代码:-

这是我的渲染代码:

0 投票
3 回答
1687 浏览

opengl - 将深度/模板缓冲区附加到帧缓冲区时出错

我通过向 OpenGL 发出这一系列命令来创建深度/模板缓冲区:

然后我尝试将它附加到帧缓冲区

但是调用glCheckFramebufferStatusEXT返回GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT。如果我不附加深度模板缓冲区,那么这个测试就很好(但显然显示器被搞砸了)。

你们有什么线索吗?

编辑:更改:我已将纹理创建简化为基本纹理的格式。

0 投票
1 回答
3003 浏览

ios - OpenGL ES 2.0 缓冲区设置

我注意到如果我在颜色缓冲区之前绑定我的深度缓冲区,应用程序会按预期工作:

但是,之后绑定深度缓冲区不会导致任何渲染,即使我的 glClearColor 设置也被忽略:

通过彻底研究各个组件,我已经了解了 OpenGL ES 2.0 如何工作的一些流程,但这似乎是每个人在他们的教程/书籍中所做的唯一事情,但没有解释原因。有任何想法吗?这甚至是一个问题,或者我的其余设置可能有问题吗?(如果是这样,我将包括所有代码)

编辑

@cli_hlt - 深度缓冲区已被添加到帧缓冲区:

编辑

之前的深度限制:

在此处输入图像描述 在此处输入图像描述

深度限制后:

在此处输入图像描述

0 投票
3 回答
8572 浏览

opengl - OpenGL,如何将帧缓冲区中的深度缓冲区用作通常的深度缓冲区

我有帧缓冲区,具有深度组件和 4 个颜色附件和 4 个纹理

我在其中绘制了一些东西并在之后解除绑定缓冲区,使用 4 个纹理进行片段着色器(延迟照明)。后来我想在屏幕上画更多的东西,使用我的帧缓冲区中的深度缓冲区,这可能吗?

我尝试再次绑定帧缓冲区并指定 glDrawBuffer(GL_FRONT),但它不起作用。

0 投票
1 回答
131 浏览

opengl - 如何对某个范围进行深度测试?

在一定范围内进行深度测试的最常见/最简单/最快的方法是什么?

pass if (currentDepth-offset < newDepth && newDepth < currentDepth)

  • currentDepth := 深度缓冲区中的值
  • offset := 常量(在编译时知道并且所有片段都相同)
  • newDepth := 片段的深度

理想情况下,函数 glDepthFunc(...) 会更灵活。