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

render depth buffer to texture using glCopyTexSubImage2D

本文关键字:纹理 缓冲区 glCopyTexSubImage2D 深度 使用      更新时间:2023-10-16

我想将深度缓冲区渲染为纹理,并使用 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并绘制一个四边形

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

如果您对此问题有一些想法,我需要一些帮助

附言我不想使用 FBO

如果您的纹理变成全白,则它确实被正确渲染。

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

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

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