我正在学习如何在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)位精度深度缓冲区?
答案 0 :(得分:1)
如果我使用GL_DEPTH_COMPONENT24作为纹理格式(要创建24位精度的深度纹理),我应该使用什么作为我的数据类型?
GL_UNSIGNED_INT。但根据这个答案,除非您想从CPU访问深度缓冲区数据,否则它并不重要:https://stackoverflow.com/a/19307871/126995
如何创建24(或16)位精度深度缓冲区?
16位深度缓冲区包含整数,就像24位缓冲区一样。它们的正确数据类型是GL_UNSIGNED_SHORT。