如何创建24位深度缓冲区openGL

时间:2018-02-18 22:41:33

标签: opengl

我正在学习如何在opengl中使用framebuffers。据我所知,到目前为止,如果我想将图像渲染到帧缓冲区,我首先会创建一个纹理,然后将其附加到framebuffers颜色附件。代码可能如下所示:

glGenTextures(1, &handle);
glBindTexture(GL_TEXTURE_2D, handle);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

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_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glBindTexture(GL_TEXTURE_2D, 0);

此代码生成纹理句柄,绑定它,并为目标GL_TEXTURE_2D生成空纹理。由于格式指定为GL_RGB且数据类型为GL_UNSIGNED_BYTE,因此在渲染到此纹理后,数据将如下所示:

R   G   B   R   G   B   R   G   B   R   G   B   R   G   B   R ...
23  25  40  1   4   67  255 255 255 0   0   1   3   5   55  72 ...

因此有3个通道,每个通道由单字节数据组成。现在我想我可以将这个纹理附加为帧缓冲的颜色附件,如下所示:

glGenFramebuffers(1, &fbohandle);
glBindFramebuffer(GL_FRAMEBUFFER, fbohandle);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, handle, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

希望我对此的理解是正确的。现在考虑尝试将深度值渲染到纹理。这可能看起来像:

glGenTextures(1, &handle);
glBindTexture(GL_TEXTURE_2D, handle);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);

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_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glBindTexture(GL_TEXTURE_2D, 0);

glGenFramebuffers(1, &fbohandle);
glBindFramebuffer(GL_FRAMEBUFFER, fbohandle);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, handle, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

在这种情况下,我生成一个空纹理,这次能够为深度存储一个浮点值(纹理每个像素有一个通道)。因此,深度纹理中的每个值都具有32位精度。然而,我经常看到引用深度分量存储为16或24位。例如,在RenderTextures的Unity引擎文档中,声明" 在OpenGL上,它是本地"深度组件"格式(通常为24或16位),在Direct3D9上,它是32位浮点(" R32F")格式。"

确实在查看Khronos wiki时,我发现存在GL_DEPTH_COMPONENT16,GL_DEPTH_COMPONENT24,GL_DEPTH_COMPONENT32和GL_DEPTH_COMPONENT32F。如果我使用GL_DEPTH_COMPONENT24作为纹理的格式(以创建24位精度的深度纹理),我应该使用什么作为我的数据类型?据我所知,没有24位浮点数。我对帧缓冲区和纹理的理解(如此处所述)在数据存储方式方面是否正确?如何创建24(或16)位精度深度缓冲区?

1 个答案:

答案 0 :(得分:1)

  

如果我使用GL_DEPTH_COMPONENT24作为纹理格式(要创建24位精度的深度纹理),我应该使用什么作为我的数据类型?

GL_UNSIGNED_INT。但根据这个答案,除非您想从CPU访问深度缓冲区数据,否则它并不重要:https://stackoverflow.com/a/19307871/126995

  

如何创建24(或16)位精度深度缓冲区?

16位深度缓冲区包含整数,就像24位缓冲区一样。它们的正确数据类型是GL_UNSIGNED_SHORT。