如何在WebGL2中读取附加到FBO的深度纹理

时间:2016-05-18 07:39:00

标签: graphics opengl-es webgl webgl2

我现在正在使用WebGL2.0处理延迟着色。我现在面临的一个主要问题是我无法从DEPTH_ATTACHMENT中读取深度值。实际上我创建了自己的GBuffer,其DEPTH24_STENCIL8纹理为DEPTH_ATTACHMENT,然后我将此纹理绑定到采样器并尝试在延迟着色部分中读取片段着色器中的值,如下所示:

uniform sampler2D u_depthSampler;
vec4 depthValue = texture(u_depthSampler, v_uv);

然后我在我的着色片段着色器中将depthValue设置为输出:

layout(location = 0) out vec4 o_fragOut;
o_fragColor.xyz = depthValue.xyz;
o_fragColor.w = 1.0;

在firefox上执行此操作时,它没有报告任何错误,但输出颜色只是纯红色。(我认为这意味着vec3(1.0,0.0,0.0))。这真让我很困惑。谁能提供一些指导?我的glsl代码有问题吗? THX〜

2 个答案:

答案 0 :(得分:1)

深度缓冲区不是线性的。要线性化它,请使用以下公式:

float f = 1000.0; //far plane
float n = 1.0; //near plane
float z = (2.0 * n) / (f + n - texture2D( diffuse, texCoord ).x * (f - n));

gl_FragColor = vec4(z,z,z, 255)

答案 1 :(得分:0)

很抱歉,我可能犯了一个大错误,即深度纹理实际上是接近纯红色但不是真正的红色。我试过这个:

float depthPow = pow(depthValue.x, 10.0);
o_fragOut.xyz = vec3(depthPow);

我认为我得到了正确的结果。