使用glCopyTexSubImage2D将深度缓冲区渲染到纹理

时间:2014-11-19 04:19:05

标签: c++ opengl

我想将深度缓冲区渲染到纹理,并使用DepthTexture绘制四边形。 但它不起作用。

首先我制作DepthTexture:

glGenTextures(1, &_iTexDepth);
glBindTexture(GL_TEXTURE_2D, _iTexDepth);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
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 );
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, _w, _h, 0, 
    GL_DEPTH_COMPONENT,  GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

并准备渲染:

glViewport(0, 0, _w, _h);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(camera_proj);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(camera_modelview);
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_PIXEL_MODE_BIT); 
    glDrawBuffer(GL_BACK);
    glReadBuffer(GL_BACK);
glClearColor(0, 0, 0, 1);
glClearDepth(1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

并渲染一些东西,并复制到纹理:

glBindTexture(GL_TEXTURE_2D, _iTexDepth);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, _w, _h);
glBindTexture(GL_TEXTURE_2D, 0);

最后,我绑定_iTexDepth并绘制一个Quad

此代码适用于GL_RGBA8纹理,但不适用于GL_DEPTH_COMPONENT(仅限DEPTH_COMPONENT白色)

如果您对此问题有所了解,我需要一些帮助

P.S。我不想使用FBO

1 个答案:

答案 0 :(得分:0)

如果你的纹理全部变成白色,那么它确实被正确渲染。

我认为问题在于投影矩阵中远近平面的设置。深度缓冲区不是线性的,如果你的近平面非常接近,比如0.1,你的远平面很像500.0,那么很多可能的深度值都非常接近你的近平面。

将近平面设置为2.0甚至更高的位置会更好。尝试不同的近/远平面值,如果您仍然遇到问题,请告诉我。

至于你的英语,没关系!作为日本人的前私人英语老师,你的标准非常好。