Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL GLGENERAEMIPMAP和帧缓冲区_C++_Opengl_Mipmaps - Fatal编程技术网

C++ OpenGL GLGENERAEMIPMAP和帧缓冲区

C++ OpenGL GLGENERAEMIPMAP和帧缓冲区,c++,opengl,mipmaps,C++,Opengl,Mipmaps,我正在绞尽脑汁动态生成mipmap,并用以下代码阅读这一部分: 我的问题是: 为什么在渲染到纹理的情况下需要调用两次glGenerateMipmap 是不是每帧都要这样叫 例如,如果我导入漫反射2d纹理,我只需要在加载到OpenGL后调用它一次,如下所示: GLCALL(glGenTextures(1, &mTexture)); GLCALL(glBindTexture(GL_TEXTURE_2D, mTexture)); GLint format = (col

我正在绞尽脑汁动态生成mipmap,并用以下代码阅读这一部分:

我的问题是:

  • 为什么在渲染到纹理的情况下需要调用两次
    glGenerateMipmap
  • 是不是每帧都要这样叫
  • 例如,如果我导入漫反射2d纹理,我只需要在加载到OpenGL后调用它一次,如下所示:

        GLCALL(glGenTextures(1, &mTexture));
        GLCALL(glBindTexture(GL_TEXTURE_2D, mTexture));
    
        GLint format = (colorFormat == ColorFormat::COLOR_FORMAT_RGB ? GL_RGB : colorFormat == ColorFormat::COLOR_FORMAT_RGBA ? GL_RGBA : GL_RED);
        GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, format, textureWidth, textureHeight, 0, format, GL_UNSIGNED_BYTE, &textureData[0]));
    
        GLCALL(glGenerateMipmap(GL_TEXTURE_2D));
        GLCALL(glBindTexture(GL_TEXTURE_2D, 0));
    
    我怀疑这是因为纹理在每一帧都会被重新绘制,并且mipmap生成过程中会使用其内容,但我想确认一下

    3-此外,如果我渲染到我的gbuffer,然后立即将其
    glBlitFramebuffer
    渲染到默认FBO,是否需要像这样绑定和
    glGenerateMipmap

    GLCALL(glBindTexture(GL_TEXTURE_2D, mGBufferTextures[GBuffer::GBUFFER_TEXTURE_DIFFUSE]));
    GLCALL(glGenerateMipmap(GL_TEXTURE_2D));
    GLCALL(glReadBuffer(GL_COLOR_ATTACHMENT0 + GBuffer::GBUFFER_TEXTURE_DIFFUSE));
    GLCALL(glBlitFramebuffer(0, 0, mWindowWidth, mWindowHeight, 0, 0, mWindowWidth, mWindowHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR));
    
  • 正如您链接到的帖子中所解释的,“[
    glGenerateMipmap
    ]实际上做了两件事,这可能是它唯一的问题:分配mipmap内存和生成mipmap。”

    请注意,第一个
    glGenerateMipmap
    调用之前是一个带有空数据指针的
    glTexImage2D
    调用。这两个调用的组合将简单地为所有纹理级别分配内存。此时它们包含的数据是垃圾

    将图像加载到纹理的第一级后,必须再次调用
    glGenerateMipmap
    ,以实际使用下采样图像填充较小的级

  • 您的猜测是正确的,
    glGenerateMipmap
    被称为每一帧,因为渲染到纹理第一级的图像每一帧都会发生变化(因为它被渲染到)。如果不调用该函数,则将永远不会修改较小的mipmap(如果要映射这样的纹理,在足够远的地方,您将看到未初始化的较小mipmap级别)

  • 不需要。仅当您打算使用使用mipmap的纹理过滤模式将纹理映射到三角形时,才需要mipmap。如果只处理纹理的第一级,则不需要生成mipmap。事实上,如果从不映射纹理,可以在帧缓冲区中使用renderbuffer而不是纹理

  • GLCALL(glBindTexture(GL_TEXTURE_2D, mGBufferTextures[GBuffer::GBUFFER_TEXTURE_DIFFUSE]));
    GLCALL(glGenerateMipmap(GL_TEXTURE_2D));
    GLCALL(glReadBuffer(GL_COLOR_ATTACHMENT0 + GBuffer::GBUFFER_TEXTURE_DIFFUSE));
    GLCALL(glBlitFramebuffer(0, 0, mWindowWidth, mWindowHeight, 0, 0, mWindowWidth, mWindowHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR));