我可以从JavaScript中的WebGL深度纹理读取单像素值吗? 简言之

我可以从JavaScript中的WebGL深度纹理读取单像素值吗? 简言之,javascript,webgl,depth-buffer,webgl2,mouse-picking,Javascript,Webgl,Depth Buffer,Webgl2,Mouse Picking,我想从JavaScript中的WebGL 2深度纹理读取单个像素值。这有可能吗 情景 我正在WebGL 2中渲染一个场景。渲染器被赋予一个深度纹理,它将深度缓冲写入该纹理。此深度纹理用于后期处理着色器等,因此我们可以使用它 但是,我需要读取JavaScript中的单个像素值,而不是从着色器中读取。如果这是一个正常的RGB纹理,我会这样做 function readPixel(x, y, texture, outputBuffer) { const frameBuffer = gl.cre

我想从JavaScript中的WebGL 2深度纹理读取单个像素值。这有可能吗

情景 我正在WebGL 2中渲染一个场景。渲染器被赋予一个深度纹理,它将深度缓冲写入该纹理。此深度纹理用于后期处理着色器等,因此我们可以使用它

但是,我需要读取JavaScript中的单个像素值,而不是从着色器中读取。如果这是一个正常的RGB纹理,我会这样做

function readPixel(x, y, texture, outputBuffer) {
    const frameBuffer = gl.createFramebuffer();
    gl.bindFramebuffer( gl.FRAMEBUFFER, frameBuffer );
    gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0 );
    gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, outputBuffer);
}
这将把
x,y
处的像素写入
outputBuffer

但是,是否可以对深度纹理执行相同的操作?如果我只是向上面的函数传递一个深度纹理,输出缓冲区只有零,我会收到一个WebGL警告
GL\u无效\u帧缓冲区\u操作:帧缓冲区不完整。
。检查帧缓冲区状态会显示
帧缓冲区\u不完整\u附件

当然,深度纹理不是RGBA纹理,但是我们可以给它一些其他值来获得深度值,还是不可能

动机 我知道这个问题已经在StackOverflow和其他地方以某种形式被问了很多次,但总是有一些变化,让我很困惑,以我在这里提出的形式得到一个直接的是或不是的答案。此外,许多问题和来源都非常古老,仅WebGL 1,还提到了一些改变等等

如果答案是否定的,我欢迎任何关于如何轻松获得这个深度像素的建议。由于不是每个帧都执行此操作,因此我看重简单性而不是性能。用例是拾取,而经典光线相交是不可行的。(我也知道我可以将标量深度值编码到RGB像素中或从RGB像素中编码出来,但首先我需要能够从js代码中访问像素。)

我欢迎任何见解。

没有任何可能性是基于。
其中明确规定:

[…]第二种是从定义的格式中选择的实现格式 在表3.2中,不包括格式DEPTH_组件和DEPTH_模具[…]


谢谢,这已经是有用的信息了。然而,对于一个外行来说,这本身听起来并不意味着你不能阅读深度纹理。例如,人们可能希望您可以以某种方式将其视为RGB值、转换或其他内容。你知道这是完全不可能的(不使用自定义着色器读取、打包并写入RGBA纹理)?@Berthur这意味着你无法读取它。但是,我不想将规范的完整章节复制到答案中。这是OpenGL ES和(桌面)OpenGL之间的区别之一。