2

我只是尝试使用 WebGL2 渲染场景的深度值,如下所示:

//Texture
depthTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, depthTexture);
 
gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT24,
                width, height, 0,
                gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null);
 
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);

//FBO
fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, 0);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);

然后我像这样渲染它:

gl.bindFramebuffer(gl.FRAMEBUFFER, fb);

gl.useProgram(shaderProgram);

//Just a torus...
gl.bindVertexArray(vao);
 
gl.colorMask(false, false, false, false);
gl.enable(gl.DEPTH_TEST);
gl.clear(gl.DEPTH_BUFFER_BIT);
...
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);

//Then I draw a full screen quad that simply samples the depth texture
gl.bindFramebuffer(gl.FRAMEBUFFER, null)
....

它似乎工作正常,但是在对附加的深度纹理进行采样时,我得到了看起来像线性深度的东西...... 在此处输入图像描述

我用来渲染到 FBO 的程序非常基础

垂直:

#version 300 es
 
layout(location = 0) in vec3 position;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main() {
 
  gl_Position = projection * view * model * vec4(position, 1.);
}

碎片:

#version 300 es
precision highp float;


layout(location = 0) out vec4 outColor;

void main() {
  outColor = vec4(1,0,0,1)
}

我期待深度缓冲区是对数的,即使我不能确定我目前得到的东西是否真的是线性的,它看起来也不是对数的......如果它真的是线性的,不知何故这就是你应该从深度附件中得到,我很好,因为我可能需要线性而不是对数深度,但目前我不确定这是否是预期的行为,或者我正在做有问题(可能是后者)

干杯

4

1 回答 1

1

谢谢@LJ 的链接。我想我知道实际发生了什么。我之前的结论是不正确的,主要是因为我不明白发生了什么。我所看到的是,正如预期的对数深度,但由于我的近和远剪裁平面分别为 1. 和 1000.,并且环面相对接近近剪裁平面,它是 1/z 曲线的一部分值聚集在一起提供高精度的地方。一旦我增加了环面的深度,我就看到了巨大的精度损失。在使用类似如何在 WebGL2 中读取附加到 FBO 的深度纹理并使用 0.1 和 10 的近处和远处裁剪平面对其进行线性化之后(为了获得视觉反馈,因为环面的深度相对较小)我可以看到深度是线性的.

于 2017-12-06T23:07:10.667 回答