glTexImage2D()参数和生成帧缓冲区

问题描述 投票:0回答:1

根据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给出的图像数据

与此同时,我正在研究framebuffers的主题。在这个链接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个回答
3
投票

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

话虽如此,pixel transfer formattype参数与internalformat完全匹配并非绝对必要。但是他们必须与pixel transfer compatibility的规则兼容。在你引用的特定情况下,formattype值都与所使用的internalforamts兼容。所以你理论上可以做到这一点:

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

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

  1. 您不应该编写您不希望真正执行的代码。将实现从无符号规范化字节手动转换为16位浮点数会导致性能下降。即使它实际上不会进行那种转换,因为指针是NULL,你仍然永远不会希望它实际发生。所以编写有意义的代码。
  2. 您必须记住像素传输兼容性的所有规则。因为如果你弄错了,如果你要求非法转换,你会得到一个OpenGL错误,从而破坏了代码。如果你不习惯总是考虑你的formattype参数是什么,那么很容易切换到整数纹理并立即得到错误,因为你没有使用其中一种_INTEGER格式。然而,如果您一直在考虑代表您实际使用的internalformat的像素传输参数,那么您将永远不会遇到该错误。
© www.soinside.com 2019 - 2024. All rights reserved.