テクスチャをフレームバッファにアタッチしようとすると、glCheckFramebufferStatus が特定のテクスチャ サイズに対して GL_FRAMEBUFFER_UNSUPPORTED を報告します。第 2 世代と第 4 世代の iPod Touch でテストしました。失敗するテクスチャのサイズは、2 つのモデル間で同じではありません。
いくつかの興味深い結果を次に示します。
第 2 世代 - 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 ピクセル以上であれば、両方のデバイスですべて問題なく動作するようです。しかし、気になるのは、フレーム バッファ オブジェクトにアタッチするためのテクスチャ サイズの要件について書かれたものを見たことがないということです。現時点での 1 つの解決策は、テクスチャ サイズを少なくとも 16 ピクセルに制限することです。どのテクスチャ サイズが許可されているかを動的に把握するために、起動時にこのテスト コードを実行することもできますが、それは少しばかげているようです。