9

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

glReadPixels将涉及 CPU 并可能会降低性能,据我所知glBlitFramebuffer,不能将深度颜色转换为颜色,只能深度到深度。

如何在 GPU 上做到这一点?

4

3 回答 3

7

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

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

于 2011-06-14T08:57:19.067 回答
5

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

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

似乎您在访问着色器中的深度分量纹理时遇到了问题,因为您想要复制深度到颜色(这是不允许的)。如果你是,那么这是一个你应该解决的问题。

无论如何,复制应该是最后的手段。您应该尽可能使用帧缓冲区对象。只需直接渲染到您的纹理。

于 2011-06-14T09:36:32.763 回答
3

最好的方法是使用 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);
于 2011-06-16T12:27:04.077 回答