Opengl es OpenGL es 2.0读取深度缓冲区

Opengl es OpenGL es 2.0读取深度缓冲区,opengl-es,depth-buffer,Opengl Es,Depth Buffer,据我所知,我们无法在OpenGLES2.0中读取Z(深度)值。 所以我想知道如何从2D屏幕上的一个点获得3D世界坐标 事实上,我有一些随机的想法可能会奏效。既然我们可以使用glReadPixels读取RGBA值,那么我们复制深度缓冲区并将其存储在颜色缓冲区(比如ColorforDepth)中如何。当然,需要有一些好的约定,这样我们就不会丢失深度缓冲区的任何信息。然后当我们需要一个点的世界坐标时,我们将这个ColorforDepth颜色缓冲区附加到帧缓冲区,然后渲染它。因此,当我们使用glRead

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

事实上,我有一些随机的想法可能会奏效。既然我们可以使用glReadPixels读取RGBA值,那么我们复制深度缓冲区并将其存储在颜色缓冲区(比如ColorforDepth)中如何。当然,需要有一些好的约定,这样我们就不会丢失深度缓冲区的任何信息。然后当我们需要一个点的世界坐标时,我们将这个ColorforDepth颜色缓冲区附加到帧缓冲区,然后渲染它。因此,当我们使用glReadPixels读取此帧的深度信息时

但是,这将导致1帧闪烁,因为colorbuffer是从深度缓冲区转换而来的奇怪缓冲区。我仍然想知道是否有一些标准的方法来获得OpenGLES2.0的深度


Thx预付款!:)

我使用基本光线投射从触摸屏上拾取3D对象。实际上,我计算了触摸点处的屏幕法线与包含我的对象的球体之间的交点。对于非常精确的拾取或复杂的形状,必须使用多个球体


您还可以在屏幕的2D空间中投影对象的一些关键点(我将3D点乘以变换矩阵),然后与触摸点进行2D比较(距离)。

我还希望能够读取深度缓冲区中的值, 但研究表明这是不可能的

正如文森特所建议的,如果你有像球体这样的简单形状,光线投射可能会更好

对于更复杂的形状, 我正在考虑将对象渲染到(可能更小的)屏幕外缓冲区, 手动将每个顶点的一个颜色分量指定为该顶点的深度, 然后读取颜色值。这有点不雅观和烦人,需要你能够将对象空间转换为屏幕空间(我用自己的四元数来驱动矩阵,这样就可以了)。着色器可能有一种将深度信息写入颜色或模具缓冲区的方法(GL ES是否有模具缓冲区?)


如果有人有一个更干净的方法,我很想听听。

使用FBO,您可以在不显示结果的情况下进行渲染。如果您使用的是ES 2.0,则片段着色器可以访问当前片段的深度(在窗口坐标中)作为gl_FragCoord的一部分,因此您可以将其写入颜色缓冲区,使用glReadPixels返回结果并继续。或者,您可以将世界空间z作为一个变量加载,并从片段着色器写入该变量,以防这是一种更简单的方法

为了说服自己,试着写一个快速的着色器,将gl_FragCoord.z以较低的精度快速输出,例如

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

你们应该得到一个灰度,颜色的强度代表深度。因为您处于窗口坐标中,所以强度的范围为0.0(最接近的未剪裁片段)到1.0(最远的未剪裁片段)。为了不损失太多的精度,在组件之间分割值可能更有用,因为您的供应商几乎肯定不支持浮点目标缓冲区。

Tommy,请您再谈谈在组件之间分割gl_FragCoord.z。没有跟上。干杯。@dugla如果深度是32位整数,那么在R、G、B和a中可能只有8位。所以在实践中,你要做的是将向量相乘
(1256655616777216)
,然后将向量mod 1.0的每个分量存储到相关通道中。您可以稍后通过除以相关组件并相加来重新组合。@Tommy这非常有趣!!你能详细说明一下从vec4到浮点的转换的相反方向吗?你能举个例子吗?