当我尝试将纹理附加到帧缓冲区时,glCheckFramebufferStatus 报告某些纹理大小的 GL_FRAMEBUFFER_UNSUPPORTED。我已经在第 2 代和第 4 代 iPod Touch 上进行了测试。两个模型之间失败的纹理大小不相同。
以下是一些有趣的结果:
第二代 - 8x8 失败,16x8 失败,但 8x16 成功!
第 4 代 - 8x8 成功,8x16 成功,但 16x8 失败!
这是我用来测试附加不同大小纹理的一些代码:
void TestFBOTextureSize(int width, int height)
{
GLuint framebuffer, texture;
// Create framebuffer
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
// Create texture
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D,0);
// Attach texture to framebuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);
GLenum error = glGetError();
GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
if (status==GL_FRAMEBUFFER_COMPLETE_OES)
NSLog(@"%dx%d Succeeded!",width,height,status);
else
NSLog(@"%dx%d Failed: %x %x %d %d",width,height,status,error,texture,framebuffer);
// Cleanup
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, 0, 0);
glDeleteTextures(1, &texture);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
glDeleteFramebuffersOES(1, &framebuffer);
}
void TestFBOTextureSizes()
{
int width,height;
for (width=1; width<=1024; width<<=1)
{
for (height=1; height<=1024; height<<=1)
TestFBOTextureSize(width,height);
}
}
似乎只要两个尺寸至少为 16 像素,那么两个设备上的一切都可以正常工作。不过,困扰我的是,我还没有看到任何关于附加到帧缓冲区对象的纹理大小要求的文章。目前,一种解决方案是将我的纹理大小限制为至少 16 像素,但这可能会在未来中断或已经在我未尝试过的某些设备上中断?我也可以在启动时执行此测试代码,以便动态确定允许哪些纹理大小,但这似乎有点做作。