Объекты Android OpenGL ES Framebuffer - отображение глубины-буфера текстуры

Я использую Android-устройство под управлением Froyo, поддерживающее OpenGL ES 1.1 и OpenGL ES 2.0

Я хочу сделать буфер глубины текстурой. Увидев ряд примеров OpenGL, OpenGL ES на других платформах (включая iPhone), я попробовал несколько конфигураций FBO.

Кажется, я могу настроить FBO с цветовой текстурой, но каждый раз, когда я прикрепляю текстуру глубины, она терпит неудачу.

Мой текущий код основан на этом примере, но также создает цветовую текстуру, вместо того, чтобы устанавливать буферы рисования и чтения на none.

Есть ли простой пример настройки OpenGL ES FBO на Android для отображения глубины текстуры? В качестве альтернативы есть документ, описывающий, что есть и не поддерживается?


Спасибо за комментарии - я специально нуждался в решении для ES 1.1, если его можно было найти и работать на Android. Я также хочу взглянуть на ES 2 - я не уверен, что понимаю идею упаковки информации о глубине в цветовой буфер. У вас есть ссылка, на которую я могу взглянуть, чтобы лучше понять идею?

Что касается кода - мой источник едва ли отличается от ссылки, которую я опубликовал выше. Статус Framebuffer заключается в том, что он не является полным.


Спасибо за предложение шейдера фрагмента - я понял эту идею сейчас. Посмотрите на это, если я не смогу заставить другое решение работать. Моим идеалом является получение глубины и цвета в одно и то же время - на самом деле не нужно выделять цвет и глубину отдельно, если я могу помочь.

Ответы

Ответ 1

ОК, ответ. Получил это, чтобы работать на Android 2.2 с OpenGL ES 2:

    // Create a frame buffer
    glGenFramebuffers( 1, &(frame_buffer ) );

    // Generate a texture to hold the colour buffer
    glGenTextures(1, &(colour_texture) );
    glBindTexture(GL_TEXTURE_2D, colour_texture);
    // Width and height do not have to be a power of two
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
            pixelWidth, pixelHeight,
            0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    // Probably just paranoia
    glBindTexture(GL_TEXTURE_2D, 0);

    // Create a texture to hold the depth buffer
    glGenTextures(1, &(depth_texture) );
    glBindTexture(GL_TEXTURE_2D, depth_texture);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
            pixelWidth, pixelHeight,
            0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glBindTexture(GL_TEXTURE_2D, 0);        

    glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer);

    // Associate the textures with the FBO.

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

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                    GL_TEXTURE_2D, depth_texture, 0);

    // Check FBO status.    
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

    if ( status == GL_FRAMEBUFFER_COMPLETE )
    {
        // Success
    }

Довольно тривиально, следуйте руководству OpenGL ES2 и делайте все в правильном порядке.

Пробовал это с помощью OpenGL ES 1.1, добавив OES к требуемым вызовам функций и _OES для констант, поскольку объекты буфера фрейма являются расширением. Любая попытка прикрепить текстуру глубины к буму кадра приводит к созданию объекта незавершенного фрейма кадра.

Итак, в тот момент я пришел к выводу, что это не работает с OpenGL ES 1.1 на Android, но он явно работает с ES 2.2.

Если у кого-то есть решение для ES 1.1, было бы интересно увидеть его.

Ответ 2

Рендеринг текстуры глубины не поддерживается на многих устройствах. Вам нужно будет прикрепить буффер для буфера глубины.