问题标签 [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.
opengl - 为什么 glPolygonOffset 与多边形的斜率有关
我正在使用 OpenGL 进行阴影映射。将深度与阴影贴图进行比较时会出现 z-fighting 问题。我可以使用 glPolygonOffset 解决问题。我知道这个功能有助于推动(或拉动)多边形一点点,以便解决 z-fighting 问题。但我对函数 glPolygonOffset 有疑问。我不清楚为什么多边形的斜率与偏移量有关。
从这里:
需要使用 factor 参数来确保接近观察者边缘的填充图元的正确结果。在这种情况下,由两个共面图元生成的同一像素的 Z 值之间的差异可能与 X 或 Y 中的最大 Z 斜率一样大。这个 Z 斜率对于接近边缘的图元来说会很大,并且几乎不存在对于正面基元。因子参数允许您将这种类型的变量差异添加到生成的深度偏移中。
在这里我不知道为什么“两个共面图元生成的同一像素的 Z 值之间的差异可以与 X 或 Y 中的最大 Z 斜率一样大”。
opengl - 无法在 OpenGL 中进行深度测试
我使用SFML创建窗口。
在这个屏幕截图中,立方体应该在金字塔的后面,但它不起作用。
这是我使用的最小代码:
我试过不同的深度函数,GL_LESS,GL_EQUAL,我都试过了。同样在不同的地方启用和禁用深度测试,似乎没有任何效果。
我正在运行 Mac OS X 10.7 ( Lion ),不确定这是否重要,尽管在升级之前我似乎对这些事情没有任何问题。
c++ - 为什么 GL_LEQUAL 推荐用于 GL 深度函数(为什么它对我不起作用)?
在GL wiki上,他们建议使用 GL_LEQUAL 作为深度函数。此外,深度函数默认为 GL_LESS。当我使用这些功能中的任何一个时,我都会得到奇怪的结果。在这张图片中,红色方块应该在蓝色方块的前面(两个方块大小相同):
但是,如果我使用glClearDepth(0.0)
and then glDepthFunc(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 得到了正确的结果。
opengl-es - OpenGL中具有alpha值的纹理深度
我正在为 Android 开发 OpenGL ES 1.x 中的应用程序,并且在使用 alpha 蒙版进行多边形的深度测试时遇到问题。如何使程序仅在 alpha!=0 的值中计算深度测试?我试过了glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.1f);
,但它没有改变任何东西,我不明白为什么。
提前致谢。
c++ - 在 OpenGL 中使用具有 Alpha 的纹理渲染 3D 模型
因此,我试图找出在 OpenGL 中渲染 3D 模型的最佳方法,因为它的某些纹理具有 alpha 通道。
当我启用深度缓冲区并开始绘制 3D 模型中的所有三角形时,如果它绘制了一个位于模型中另一个三角形前面的三角形,它在到达它时根本不会渲染后三角形。问题是当前面的三角形具有 alpha 透明度时,应该可以看到后面的三角形,但后面的三角形仍然没有渲染。
禁用深度缓冲区消除了这个问题,但会产生一个明显的问题,即如果三角形不透明,那么如果在之后渲染,它仍然会在其后面渲染三角形。
例如,我正在尝试渲染一棵松树,它基本上是一些相互堆叠的具有透明底座的锥体。下图显示了启用深度缓冲区时出现的问题:
您可以看到仍然可以看到透明三角形的轮廓。
下图显示了禁用深度缓冲区时的样子。
在这里,您可以看到树后面的一些三角形是如何在树的其余部分前面渲染的。
任何想法如何解决这个问题,并正确渲染松树?
PS我正在使用着色器来渲染一切。
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 或更高版本
这是我的初始化代码:-
这是我的渲染代码:
opengl - 将深度/模板缓冲区附加到帧缓冲区时出错
我通过向 OpenGL 发出这一系列命令来创建深度/模板缓冲区:
然后我尝试将它附加到帧缓冲区
但是调用glCheckFramebufferStatusEXT
返回GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
。如果我不附加深度模板缓冲区,那么这个测试就很好(但显然显示器被搞砸了)。
你们有什么线索吗?
编辑:更改:我已将纹理创建简化为基本纹理的格式。
ios - OpenGL ES 2.0 缓冲区设置
我注意到如果我在颜色缓冲区之前绑定我的深度缓冲区,应用程序会按预期工作:
但是,之后绑定深度缓冲区不会导致任何渲染,即使我的 glClearColor 设置也被忽略:
通过彻底研究各个组件,我已经了解了 OpenGL ES 2.0 如何工作的一些流程,但这似乎是每个人在他们的教程/书籍中所做的唯一事情,但没有解释原因。有任何想法吗?这甚至是一个问题,或者我的其余设置可能有问题吗?(如果是这样,我将包括所有代码)
编辑
@cli_hlt - 深度缓冲区已被添加到帧缓冲区:
编辑
之前的深度限制:
深度限制后:
opengl - OpenGL,如何将帧缓冲区中的深度缓冲区用作通常的深度缓冲区
我有帧缓冲区,具有深度组件和 4 个颜色附件和 4 个纹理
我在其中绘制了一些东西并在之后解除绑定缓冲区,使用 4 个纹理进行片段着色器(延迟照明)。后来我想在屏幕上画更多的东西,使用我的帧缓冲区中的深度缓冲区,这可能吗?
我尝试再次绑定帧缓冲区并指定 glDrawBuffer(GL_FRONT),但它不起作用。
opengl - 如何对某个范围进行深度测试?
在一定范围内进行深度测试的最常见/最简单/最快的方法是什么?
pass if (currentDepth-offset < newDepth && newDepth < currentDepth)
- currentDepth := 深度缓冲区中的值
- offset := 常量(在编译时知道并且所有片段都相同)
- newDepth := 片段的深度
理想情况下,函数 glDepthFunc(...) 会更灵活。