我在我的 FBO 中从渲染缓冲区切换到深度纹理。但它似乎不包含任何深度数据。如果我将此纹理渲染到全屏四边形,一切都是黑色的。我很确定纹理和 FBO 设置没问题.FBO 已完成,如果我清除深度,让我们对灰色说:
glClearDepth(0.5f);
然后我看到 blit pass 中的颜色,但看不到几何渲染中的数据。
无论如何,这就是我创建纹理的方式:
glBindTexture ( GL_TEXTURE_2D, _id );
glTexStorage2D(GL_TEXTURE_2D,1,intFmt,theWidth,theHeight);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
glBindTexture(_target,0);
其中 intFmt 是 GL_DEPTH_COMPONENT24 或 GL_DEPTH_COMPONENT32 (都试过了..)
这就是我将它附加到 FBO 的方式:
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
glBindTexture(GL_TEXTURE_2D, _id);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target,_id, 0);
这是 blit pass 片段着色器:
#version 420
layout(binding=0) uniform sampler2D COLOR_MAP_0;
smooth in vec2 uvsOut;
out vec4 OUTPUT;
void main(void) {
ivec2 tsize = textureSize(COLOR_MAP_0, 0);
vec2 screntc = gl_FragCoord.xy * (1.0 / vec2(tsize));
OUTPUT = vec4(texture(COLOR_MAP_0, screntc).rrr ,1) ;
}
也许我应该在片段着色器中明确写深度?
我试图在 blit 片段着色器中线性化深度。它有效。现在我可以看到深度。但是我看到没有它的白色和一些灰色阴影。在快照中:左侧部分是使用线性化绘制的,而右侧部分是从深度采样的直接纹理。