Android NDK OpenGL ES 1.0 Простой рендеринг

Я начинаю с Android NDK и OpenGL. Я знаю, что я делаю что-то (возможно, несколько) неправильно, и, поскольку я продолжаю получать черный экран, когда я тестирую, я знаю, что рендеринг не отправляется на экран.

В Java у меня есть GLSurfaceView.Renderer, который вызывает эти два нативных метода. Они вызываются правильно, но не отображаются на экране устройства.

Может ли кто-нибудь указать мне правильное направление с этим?

Вот собственные реализации методов:

int init()
{
    sendMessage("init()");

    glGenFramebuffersOES(1, &framebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

    glGenRenderbuffersOES(1, &colorRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, 854, 480);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

    GLuint depthRenderbuffer;
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, 854, 480);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

    GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
    if(status != GL_FRAMEBUFFER_COMPLETE_OES)
        sendMessage("Failed to make complete framebuffer object");

    return 0;
}

void draw()
{
    sendMessage("draw()");

    GLfloat vertices[] = {1,0,0, 0,1,0, -1,0,0};
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
}

Вывод журнала:

init () draw () draw () draw () и т. д.

3 ответа

Решение

Я наконец-то нашел проблему после МНОГО ковыряния.

Оказывается, поскольку я вызывал код из GLSurfaceView.Renderer в Java, буфер кадра уже существовал и поэтому вызывал:

glGenFramebuffersOES(1, &framebuffer);

Я непреднамеренно выделял НОВЫЙ буфер, который не был прикреплен к целевому дисплею. Удалив эту строку и заменив ее на:

framebuffer = (GLuint) 0;

Теперь он рендерится в правильный буфер и правильно отображается на экране. Обратите внимание, что хотя я и не использую буфер в этом фрагменте, его изменение - вот что испортило правильное отображение.

Я не думаю, что это реальное решение вообще.

У меня возникла та же проблема: я использую объекты кадрового буфера внутри собственного кода и делаю

framebuffer = (GLuint) 0;

вы используете только фрейм-буфер по умолчанию, который всегда существует и зарезервирован для 0. Технически, вы можете стереть весь свой код, связанный с фрейм-буферами, и ваше приложение должно работать должным образом, так как фрейм-буфер 0 всегда генерируется и привязывается по умолчанию.,

Но вы должны иметь возможность генерировать несколько кадровых буферов и переключаться между ними, используя функцию привязки (glBindFramebuffer) по своему усмотрению. Но это, похоже, не работает с моей стороны, и я пока не нашел реального решения. На андроиде не так много документации, и я начинаю задумываться, действительно ли fbo поддерживается в нативном коде. Они действительно работают должным образом внутри кода Java, хотя, я проверил это с успехом!

Ой! И я только что заметил, что размер вашего буфера не равен степени 2... что обычно должно быть так для всех текстур / буферов, таких как структура в Opengl.


ОБНОВИТЬ:

Теперь я совершенно уверен, что вы не можете использовать FBO с Android (2.2 или ниже) и ndk (версия r5b или ниже). Это совершенно другая игра, если вы используете новую версию 3.1, где вы можете кодировать все свое приложение с помощью собственного кода (больше не требуется jni-оболочка), но я еще не тестировал его!

С другой стороны, мне удалось заставить буферы и текстуры трафарета работать безупречно! Поэтому обходной путь будет заключаться в том, чтобы использовать их для моей логики рендеринга и просто забыть о рендеринге FBO за кадром.

У меня были похожие проблемы при переходе с iOS на Android NDK, вот и мое полное решение.

OpenGLES 1.1 с FrameBuffer / ColorBuffer / DepthBuffer для Android с NDK r7b

Другие вопросы по тегам