C++ OpenGL GLGENERAEMIPMAP和帧缓冲区
我正在绞尽脑汁动态生成mipmap,并用以下代码阅读这一部分: 我的问题是: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
glGenerateMipmap
李>
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级别)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));