glFramebufferTexture2D не работает на iPhone для определенных размеров текстур - PullRequest
2 голосов
/ 29 апреля 2011

Когда я пытаюсь прикрепить текстуру к кадровому буферу, 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 пикселей, но может ли это произойти в будущем или уже сломаться на каком-то устройстве, которое я не пробовал? Я мог бы также выполнить этот тестовый код при запуске, чтобы динамически выяснить, какие размеры текстур разрешены, но это выглядит немного странно.

1 Ответ

1 голос
/ 01 июля 2011

У меня возникла похожая проблема, когда я пытаюсь выполнить рендеринг в текстуру размером 480x320 (полный экран без шкалы разрешения) на iPod touch 4. Когда я звоню glCheckFramebufferStatus(), возвращается GL_FRAMEBUFFER_UNSUPPORTED. Мой код:

glGenTextures(1, &texture);    
glBindTexture(GL_TEXTURE_2D, texture);        
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 480, 320, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0);
glBindTexture(GL_TEXTURE_2D, 0);

glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
    // report error
}

Исследуя эту проблему, я обнаружил, что GL_TEXTURE_2D должен быть допустимым объектом OpenGL ES, если мы хотим, чтобы он использовался в механизме рендеринга в текстуру. Это означает, что текстура должна быть готова для привязки и использования. Поэтому, чтобы исправить ошибку, я должен установить некоторые параметры текстуры. Поскольку я использую текстуру без POT, я должен установить GL_TEXTURE_WRAP_ на GL_CLAMP_TO_EDGE (значение по умолчанию GL_REPEAT) и GL_TEXTURE_MIN_FILTER на GL_NEAREST или GL_LINEAR (значение по умолчанию GL_NEAREST_MIPMAP_LINEAR), чтобы использовать эту текстуру ,

Я не смог найти, в чем проблема с 16x8, но 16x9 и 17x8 работают нормально, если установлены эти параметры. Я надеюсь, что эта информация будет полезна для вас.

...