我想将当前深度缓冲区获取到纹理,以在着色器中访问它.由于各种原因,我无法进行单独的深度传递,但需要复制已经渲染的深度.
glReadPixels将涉及CPU并可能杀死性能,据我所知glBlitFramebuffer,不能深入到颜色,只有深度到深度.
如何在GPU上执行此操作?
将深度缓冲区复制到纹理非常简单.如果您创建了一个未调用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, 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)
| 归档时间: |
|
| 查看次数: |
9440 次 |
| 最近记录: |