OpenGL FBO深度格式和类型混淆
OpenGL FBO depth format and type confusion
我对内部格式、格式和类型有点困惑。那么深度附着点是什么?
如果我正在使用 RenderBuffer,如果我不想使用模板,我认为这是有效的代码:
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRB);
但是,如果我想能够读取深度值,我必须将纹理附加到深度附加点。所以我必须使用参数 "internal format"、"format" 和 "type".
调用 glTexImage2D 函数
在这种情况下,我应该选择哪种内部格式、格式和类型?我可以使用以下组合进行深度附件吗? (顺序为:内部格式、格式和类型)
- GL_R32F、GL_RED、GL_FLOAT
- GL_DEPTH_COMPONENT32、GL_DEPTH_COMPONENT、GL_UNSIGNED_INT
- GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT
GL_UNSIGNED_INT 类型对第二种情况有效吗?那个的真实意义是什么?它会为每个片段分配 4 个字节吗?在一些教程中,他们使用 GL_UNSIGNED_BYTE 作为类型参数。哪个是正确的?
谢谢
编辑:
澄清了我对哪些参数感兴趣的问题。
深度值不是颜色值。因此,如果你想在纹理中存储深度值,纹理必须使用 internal format that contains depth information.
pixel transfer format/type 参数,即使您实际上没有传递数据,也必须在内部格式方面合理。由于内部格式包含深度信息,您的像素传输格式必须指定深度信息:GL_DEPTH_COMPONENT
.
至于像素转移 type,您应该将 32F
读回 GL_FLOAT
。
我对内部格式、格式和类型有点困惑。那么深度附着点是什么?
如果我正在使用 RenderBuffer,如果我不想使用模板,我认为这是有效的代码:
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRB);
但是,如果我想能够读取深度值,我必须将纹理附加到深度附加点。所以我必须使用参数 "internal format"、"format" 和 "type".
调用 glTexImage2D 函数在这种情况下,我应该选择哪种内部格式、格式和类型?我可以使用以下组合进行深度附件吗? (顺序为:内部格式、格式和类型)
- GL_R32F、GL_RED、GL_FLOAT
- GL_DEPTH_COMPONENT32、GL_DEPTH_COMPONENT、GL_UNSIGNED_INT
- GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT
GL_UNSIGNED_INT 类型对第二种情况有效吗?那个的真实意义是什么?它会为每个片段分配 4 个字节吗?在一些教程中,他们使用 GL_UNSIGNED_BYTE 作为类型参数。哪个是正确的?
谢谢
编辑:
澄清了我对哪些参数感兴趣的问题。
深度值不是颜色值。因此,如果你想在纹理中存储深度值,纹理必须使用 internal format that contains depth information.
pixel transfer format/type 参数,即使您实际上没有传递数据,也必须在内部格式方面合理。由于内部格式包含深度信息,您的像素传输格式必须指定深度信息:GL_DEPTH_COMPONENT
.
至于像素转移 type,您应该将 32F
读回 GL_FLOAT
。