据我所知,我们无法读取在OpenGL ES 2.0的Z(深度)值。 所以,我想知道我们如何能够从2D屏幕上的一个点获得3D世界坐标?

其实,我有一些杂感可能会奏效。既然我们可以用glReadPixels,怎么样,我们复制了深度缓冲,并将其存储在一个颜色缓冲区里的RGBA值(说ColorforDepth)。当然,我们需要有一些很好的约定,这样我们就不会失去深度缓冲的任何信息。然后,当我们需要一个点的世界坐标,我们非常重视这个ColorforDepth颜色缓冲区帧缓冲,然后对其进行渲染。所以,当我们用glReadPixels来阅读本框架的深度信息。

然而,这将导致1个闪光由于colorbuffer是一个奇怪的缓冲器从深度缓冲器转换。我仍然想知道是否有一些标准的方式来获得深度的OpenGL ES 2.0?

Thx提前:!)

有帮助吗?

解决方案

使用一个FBO,可以渲染而不显示结果。如果您在ES 2.0的时候,您的片段着色器可以访问当前片段的深度(在窗口坐标)作为gl_FragCoord的一部分,所以你可以写在彩色缓冲区,利用glReadPixels得到结果回来继续。另外,您也可以加载世界空间Z作为变和写入,从你的片段着色器,如果周围是一个更简单的方法。

要说服自己,尝试写一个快速着色器放入精度低,如贸然gl_FragCoord.z出刚

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

您应该得到与代表深度的颜色的强度的灰度。因为你在窗口坐标是,强度范围从0.0(最接近的可能别夹子片段)到1.0(最远的未截短的可能片段)。为了不失去相当多的精度,这可能更有利于拆分组件之间的价值,因为你的供应商几乎肯定不支持浮点目标缓冲区。

其他提示

我使用碱性光线投射用于从屏幕触摸拾取的3D对象。事实上,我计算在触摸点的屏幕正常和含有我的对象的球体之间的交点。对于一个非常精确的拾取或复杂的形状则必须使用若干球。

您还可以对您在二维空间物体的你Screen项目的一些关键点(我用你的变换矩阵相乘,你的3D点),然后做一些2D的比较(距离)与您联系点。

我还要能在深度缓冲器读取值, 但研究表明它不能这样做。

文森特建议,如果你有简单的形状像球体,光线投射可能是更好的。

有更复杂的形状寿, 我在想渲染对象到一个(可能更小)离屏缓冲器的, 手动分配每个顶点的色彩分量中的一个作为该顶点的深度, 然后读取的颜色值。这有点不雅和恼人寿,并要求你要能够对象的空间转换到屏幕空间(我用我自己的四元数来驱动矩阵,使需要的是照顾)。可能存在与着色器写入深度信息到颜色或模板缓冲区的方式(不GL ES甚至有一个模版缓冲器?)

如果有人有一个清洁器的方法,我希望知道它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top