Когда я пытаюсь прикрепить текстуру к кадровому буферу, glCheckFramebufferStatus сообщает GL_FRAMEBUFFER_UNSUPPORTED для определенных размеров текстуры. Я тестировал на iPod Touch 2-го и 4-го поколения. Размеры текстуры, которые терпят неудачу, не идентичны между двумя моделями.
Вот некоторые интересные результаты:
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 пикселей, все работает нормально на обоих устройствах. Однако меня беспокоит то, что я не видел ничего написанного о требованиях к размеру текстуры для присоединения к объекту кадрового буфера. Одним из решений на данный момент было бы ограничение размеров текстур не менее 16 пикселей, но может ли это произойти в будущем или уже сломаться на каком-то устройстве, которое я не пробовал? Я мог бы также выполнить этот тестовый код при запуске, чтобы динамически выяснить, какие размеры текстур разрешены, но это выглядит немного странно.