问题标签 [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 投票
2 回答
2600 浏览

opengl - 使用 OpenGL readPixels 的真实深度值

我想从我的相机视图中检索深度缓冲区以用于 3D 过滤应用程序。目前,我正在使用 glReadPixels 来获取深度组件。而不是 [0,1] 值,我需要深度缓冲区的真实值,或者在世界坐标中到相机的真实距离。

我试图通过 GL_DEPTH_BIAS 和 GL_DEPTH_SCALE 来转换深度值,但这不起作用。

我意识到这类似于从深度缓冲区获取真正的 z 值,但我想将深度值获取到主内存中,而不是在着色器中。

0 投票
1 回答
6585 浏览

android - Android OpenGL 3D 拾取

我在 Android OpenGL-ES 2.0 上,在它附带的所有限制之后,我不知道如何将 2D 屏幕触摸到我拥有的 3D 点。我无法得到正确的结果。

我正在尝试将光线射入点云,然后我可以比较我的点与光线的距离,找到最近的点。

这是我的采摘功能。出于调试目的,我将位置设置为屏幕中间:

改变透视zNear和Far都没有预期的效果,1.0-1000.0透视的远点怎么可能是11个单位呢?

寻找您在我的代码中看到的任何建议或错误。非常感激。我尽我所能(这一直是个问题)。

0 投票
1 回答
884 浏览

android - 在 OpenGL ES 中进行透明度和深度测试的解决方法?

我正在尝试使用 draw_texture 扩展使深度测试在 OpenGL ES 上正常工作。我很早就意识到使用此扩展程序渲染时“正常”z 坐标不起作用。这是由于扩展有效地使用 Z 坐标作为 0 和 1 之间的比率,而不是深度缓冲区中的实际 z 位置,如 OpenGL OES 绘制纹理页面所示:

Zs 映射到窗口深度 Zw 如下:

我在 OpenGL 的透明度常见问题解答页面上读到:

在应用程序中使用深度缓冲时,您需要注意渲染图元的顺序。需要首先渲染完全不透明的图元,然后以从后到前的顺序渲染部分不透明的图元。如果您不按此顺序渲染图元,则通过部分不透明的图元可以看到的图元可能会完全失去深度测试。

这让我想到了我的问题。我有 2 个正方形,都是 64x64。它们带有圆形纹理。“顶部”的正方形位于比下方正方形稍远的位置,如下所示。

圆形纹理是形成圆形的纯色 (s),然后是完全透明的周围区域 (t)。

当 OpenGL 渲染它时,下面的正方形没有通过深度测试并且没有被绘制,即使它上面的像素是透明的,所以你从下面的图层而不是整个图像中获得半圆形效果。

我怎样才能阻止这种情况发生?

0 投票
1 回答
1233 浏览

c++ - 从片段着色器内部影响深度或模板缓冲区?

我知道可以通过写入 gl_FragDepth 来控制写入 GLSL 中深度缓冲区的内容,但是可以写入模板缓冲区吗?

另外,我可以从片段着色器中完全取消像素写入,就好像像素没有通过模板或深度测试一样?

谢谢

0 投票
5 回答
9550 浏览

opengl-es - 如何读取 WebGL 中的深度缓冲区?

使用 WebGL API,我如何从深度缓冲区中获取值,或者以任何其他方式从屏幕坐标确定 3D 坐标(即找到单击的位置),而不是通过执行我自己的光线投射?

0 投票
1 回答
665 浏览

android - 使用 OpenGL ES 1.1 的 Android 版本之间的深度缓冲区差异

我正在用 OpenGL ES 1.0 编写一个 2d 游戏(在适用的情况下转换为 1.1 扩展)。我试图让这个尽可能通用,以防我错过了一些明显的东西。

我对 Android 2.2 (Froyo) 和 Android 2.3.3 (Gingerbread) 之间的深度测试有疑问。目前, onCreate 我有以下内容:

我在使用扩展时成功使用了深度缓冲区OES_draw_texture,这不是问题。但是,在为传统的顶点绘制指定 Z 值时,版本之间会出现奇怪的差异。

在 2.2 中,以下代码呈现在最前面(最上面):

现在,这很好用,但在 2.3.3 中,这会将对象推得更远。要使用 2.3.3 获得正确的位置,我需要执行以下操作:

这将纠正问题。

我的问题有两个:

  • 当我将深度缓冲区指定为 1 到 320 之间时,为什么必须将 Z 值指定为 -ve 而不是 +ve?标准(尽管不是 ES)文档明确指出 zNear 和 zFar 不应为 -ve 或 0。
  • 为什么 2.2 和 2.3.3 以这种方式存在差异?我的印象是 2.3.3 通过将 1 作为接近值来以“正确”的方式进行操作,这是我所期望的。那么为什么实际上一半的深度缓冲区被忽略了?

我怀疑我可能错过了 Gingerbread 隐含假设的某个命令,而 Froyo 没有,但我不确定。任何帮助,将不胜感激。

0 投票
1 回答
7565 浏览

iphone - OpenGL ES 2.x:如何丢弃深度缓冲区 glDiscardFramebufferEXT?

我阅读了iOS OpenGL ES 逻辑缓冲区负载,可以通过在每个绘制周期后“丢弃”深度缓冲区来实现性能提升。我试试这个,但这是因为我的游戏引擎不再渲染。当我尝试渲染下一个周期时,我收到 glError 1286 或 GL_INVALID_FRAMEBUFFER_OPERATION_EXT。

如果我要丢弃它,我觉得我需要在每个周期初始化或设置深度缓冲区,但我似乎找不到任何关于此的信息。这是我如何初始化深度缓冲区(实际上是所有缓冲区):

这是我试图在每个绘制周期结束时丢弃深度缓冲区的方法:

我在所有的抽奖电话之后立即调用它并且......

有任何想法吗?有人可以指出我的任何信息吗?我尝试阅读有关该主题的Apple指南(我得到了最初的想法),http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html,但它没有似乎不太适合我。

0 投票
1 回答
2457 浏览

ios - 具有深度测试的 OpenGL 点精灵 - 混合问题?

我正在渲染点精灵(在 iOS 上使用 OpenGL ES 2.0)作为用户的绘图笔画。我将这些点存储在顶点缓冲区对象中,因此我需要执行深度测试,以便精灵在提交绘制时以正确的顺序出现。

在渲染这些绘图笔画时,我看到了一种奇怪的效果,如下面的截图所示:

点精灵混合问题

注意蓝色笔划边缘周围的背景色“边框”,它被绘制在绿色上。用户在绿色笔划之后绘制了蓝色笔划,但是当重新绘制 VBO 时,首先绘制蓝色笔划。在绘制绿色笔划时,深度测试开始进行,并看到它应该在蓝色笔划之后,并且这样做并取得了一些成功。在我看来,这是某种混合问题,还是与错误计算片段着色器中的颜色有关?所有笔划的边缘都应该是透明的,但是片段着色器在处理这些片段时似乎将其与背景纹理结合在一起。

在我的应用程序中,我创建了一个深度渲染缓冲区并glEnable(GL_DEPTH_TEST)使用glDepthFunc(GL_LEQUAL). 我已经尝试过glDepthMask(),但无济于事。混合设置为glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA),并且点精灵颜色使用预乘的 alpha 值。绘图例程非常简单:

  • 绑定渲染到纹理 FBO。
  • 绘制背景纹理。
  • 绘制点精灵(来自许多 VBO)。
  • 将此 FBO 的纹理绘制到主帧缓冲区。
  • 呈现主帧缓冲区。


编辑

这是绘图例程中的一些代码。

绘图前的设置状态:

绘图程序:

谢谢你的帮助。

0 投票
4 回答
14429 浏览

opengl - 如何在片段着色器中使用 gl_FragCoord.z 在现代 OpenGL 中线性渲染深度?

我阅读了很多关于使用片段着色器获取深度的信息。

http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=234519

但我仍然不知道是否gl_FragCoord.z是线性的。

GLSL 规范说它的范围是屏幕空间中的 [0,1],但没有提到它是否是线性的。

我认为线性至关重要,因为我将使用渲染模型来匹配来自 Kinect 的深度图。

那么如果不是线性的,如何在世界空间中线性化呢?

0 投票
4 回答
7286 浏览

opengl-es - 如何在 OpenGL (ES) 中正确渲染重合多边形

我知道通过在 OpenGL ES 中设置深度函数,可以控制重叠几何图形在 3D 场景中的渲染方式。我在我的代码中使用gl.depthFunc(gl.LEQUAL)(webgl)。

然而,当两组多边形重合并且颜色不同时,生成的表面会变成两种颜色的任意混合图案(随着相机位置的变化而变化,因此会导致闪烁)。看看这张图片:

在此处输入图像描述

我怎样才能解决这个问题?我尝试了不同的 depthFunc 值,但没有一个能解决这个问题。我希望重合的多边形具有单一颜色,无论哪种颜色都没有关系。