【问题标题】:glTexImage2D() parameters and generating framebuffersglTexImage2D() 参数和生成帧缓冲区
【发布时间】:2019-02-14 03:09:45
【问题描述】:

根据opengl的参考页,glTexImage2D的结构是这样的:

void glTexImage2D(  GLenum target,
    GLint level,
    GLint internalformat,
    GLsizei width,
    GLsizei height,
    GLint border,
    GLenum format,
    GLenum type,
    const GLvoid * data);

据我所知,最后3个参数是函数应该如何解释const GLvoid * data给出的图像数据

与此同时,我正在研究帧缓冲区的主题。在此链接https://learnopengl.com/Advanced-Lighting/HDR 的“浮点帧缓冲区”部分中,作者创建了一个帧缓冲区的颜色附件,如下所示

glBindTexture(GL_TEXTURE_2D, colorBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGBA, GL_FLOAT, NULL);

我的问题是,他为什么给 GL_FLOAT 作为GLenum type 的参数?如果const GLvoid * data 是NULL 无论如何,是否需要使用GL_FLOAT?我一开始以为和GL_RGBA16F有关,但是16位是2个字节,浮点数是4个字节,所以我想这根本不相关。

此外,在本教程之前,作者曾经制作这样的颜色附件:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

在这种情况下,他为什么要用GL_UNSIGNED_BYTE作为GLenum type参数?

【问题讨论】:

    标签: opengl framebuffer glteximage2d


    【解决方案1】:

    无论最后一个参数是否为 NULL(假设未使用 PBO),format 和 type 参数必须始终是相对于 internalformat 参数的合法值。

    话虽如此,pixel transfer format 和 type 参数不一定要与 internalformat 完全匹配。但它们必须与它兼容,符合pixel transfer compatibility 的规则。在您引用的特定情况下,format 和type 值都与使用的internalforamts 中的任何一个兼容。所以理论上你可以这样做:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    

    话虽如此,你不应该,有两个原因:

    1. 您不应该编写不想真正执行的代码。让实现手动将无符号规范化字节转换为 16 位浮点数会降低性能。即使由于指针为 NULL 而实际上不会进行该转换,您仍然不会希望它实际发生。所以写出有意义的代码。

    2. 您必须记住像素传输兼容性的所有规则。因为如果你得到它们错误,如果你要求进行非法转换,你会得到一个 OpenGL 错误,从而导致代码损坏。如果您不习惯总是考虑您的format 和type 参数是什么,那么切换到整数纹理并立即收到错误非常容易,因为您没有使用_INTEGER 格式之一。然而,如果您一直在考虑代表您实际使用的 internalformat 的像素传输参数,您将永远不会遇到该错误。

    【讨论】:

    • 为了完整起见,恕我直言,值得一提的是:a) internalformat、format 和 type 的约束列在参考页面上:khronos.org/registry/OpenGL-Refpages/gl4/html/…(错误, GL_INVALID_OPERATION 特别是错误)和 b) 在 OpenGL ES 中,这些约束更加严格(不兼容的潜在来源)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-06-26
    相关资源
    最近更新 更多