问题描述
假设我有一个纹理需要 mipmap,但我希望 mipmap 完成硬件加速。我决定最好的路线是这样的:
int read = glGenFramebuffers();
int draw = glGenFramebuffers();
int wh = 256;
int glObject = glGenTextures();
glBindTexture(GL_TEXTURE_2D,glObject);
glTexImage2D(GL_TEXTURE_2D,GL_RGBA8,wh,GL_RGBA,GL_UNSIGNED_BYTE,data);
for(int i = 0; i < mipLevels; ++i) {
glBindFramebuffer(GL_FRAMEBUFFER,read);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,glObject,i);
glTexImage2D(GL_TEXTURE_2D,i + 1,wh / 2,(ByeBuffer)null);
glBindFramebuffer(GL_FRAMEBUFFER,draw);
glFramebufferTexture2D(GL_FRAMEBUFFER,i + 1);
glBindFramebuffer(GL_READ_FRAMEBUFFER,read);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,draw);
glBlitFramebuffer(0,GL_COLOR_BUFFER_BIT,GL_LINEAR);
wh /= 2;
}
调用 glCheckFramebufferStatus 时,两个帧缓冲区都在此代码块中返回 INCOMPLETE_ATTACHMENT。我究竟做错了什么?我是否正确分配了空白 mipmap 级别?
解决方法
回答:在这些情况下,我应该使用 glTexImage2D
分配空白级别时,我使用 glTexStorage2D
来分配空白 mip 级别。以下是 glTexStorage2D
手册页的链接,了解更多详情:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage2D.xhtml