如何将深度缓冲区复制到GPU上的纹理?

问题描述

| 我想将当前深度缓冲区获取到纹理,以在着色器中访问它。由于种种原因,我无法进行单独的深度传递,但是需要复制已经渲染的深度。 “ 0”会占用cpu并可能会降低性能,据我所知,“ 1”不能使深度变色,只能使深度变浅。 如何在GPU上执行此操作?     

解决方法

        现代的方法是使用FBO。将颜色和深度纹理附加到其上,进行渲染,然后禁用FBO,并将该纹理用作着色器的输入,该着色器将渲染到默认的帧缓冲区。 您可以在此处找到有关FBO的所有详细信息。     ,        将深度缓冲区复制到纹理非常简单。如果创建了尚未启用glTexImage *的新纹理,则可以使用glCopyTexImage2D。这会将像素从帧缓冲区复制到纹理。要复制深度像素,请使用GL_DEPTH_COMPONENT格式。我建议GL_DEPTH_COMPONENT24。 如果您先前已创建具有深度分量格式的纹理(即:在第一帧之后的任何时间),则可以使用glCopyTexSubImage2D直接复制到此图像数据中。 似乎还无法访问着色器中的深度组件纹理,因为您要复制深度到颜色(这是不允许的)。如果是这样,那应该是一个问题。 无论如何,复制应该是最后的方法。您应该尽可能使用framebuffer对象。只需直接渲染到您的纹理即可。     ,        最好的方法是使用FBO,以获得更好的性能和某些编码样式问题。 如果您不感兴趣,请查看此代码。那是我小时候的日子!(不知道FBO存在)
int shadowMapWidth = 512;
int shadowMapHeight = 512;
glGenTextures(1,&m_depthTexture);

glBindTexture(GL_TEXTURE_2D,m_depthTexture);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);

glTexImage2D( GL_TEXTURE_2D,GL_DEPTH_COMPONENT,shadowMapWidth,shadowMapHeight,GL_UNSIGNED_BYTE,0);
glCopyTexSubImage2D(GL_TEXTURE_2D,512,512);