【发布时间】:2013-10-14 11:01:37
【问题描述】:
我在我的 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 片段着色器中线性化深度。它有效。现在我可以看到深度。但是没有它我看到白色和一些灰色阴影。在快照中:左侧部分是使用线性化绘制的,而右侧部分直接从深度纹理中采样。
【问题讨论】:
-
您如何显示深度纹理以验证数据?您正在绘制的几何图形的远近剪裁平面和距离是多少?
-
Near is 0.1 , far 10000 .Distance to geometry is between 0 to 1000.For display depth I just bind depth texture,使用上面提到的frag shader绘制全屏四边形。
-
我认为您提供的代码没有任何问题。所以错误的部分丢失了。你检查过 glGetError() 是 0 并且你确定你的几何/视图矩阵是正确的吗?
-
我正在运行 GL 调试扩展,因此可以将所有错误直接输入控制台。一切正常。但请查看我的更新。
-
“线性化”是指标准化?