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

Ano*_*non 9 opengl glsl depth

我想将当前深度缓冲区获取到纹理,以在着色器中访问它.由于各种原因,我无法进行单独的深度传递,但需要复制已经渲染的深度.

glReadPixels将涉及CPU并可能杀死性能,据我所知glBlitFramebuffer,不能深入到颜色,只有深度到深度.

如何在GPU上执行此操作?

Nic*_*vre 7

这样做的现代方法是使用FBO.为其附加颜色和深度纹理,渲染,然后禁用FBO并使用纹理作为将渲染到默认帧缓冲区的着色器的输入.

您可以在此处找到有关FBO的所有详细信息.


Nic*_*las 5

将深度缓冲区复制到纹理非常简单.如果您创建了一个未调用glTexImage*的新纹理,则可以使用glCopyTexImage2D.这会将像素从帧缓冲区复制到纹理.要复制深度像素,请使用GL_DEPTH_COMPONENT格式.我建议GL_DEPTH_COMPONENT24.

如果先前已创建具有深度分量格式的纹理(即:在第一帧之后的任何时间),则可以使用glCopyTexSubImage2D直接复制到此图像数据中.

您似乎无法在着色器中访问深度组件纹理,因为您要复制深度到颜色(这是不允许的).如果你是,那么这是一个问题,你应该得到修复.

无论如何,复制应该是最后的手段.您应该尽可能使用framebuffer对象.只需直接渲染纹理.


Ami*_*deh 5

最好的方法是使用 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, 0, GL_DEPTH_COMPONENT, shadowMapWidth, shadowMapHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 512,512);
Run Code Online (Sandbox Code Playgroud)