Domanda

sto iniziando con l'NDK Android e OpenGL. So che sto facendo qualcosa (probabilmente alcuni) cose sbagliate qui e da allora continuo a ricevere una schermata nera quando prova so che il rendering non viene inviato allo schermo.

In Java ho un GLSurfaceView.Renderer che chiama questi due metodi nativi. Essi sono chiamati in modo corretto, ma non disegno per lo schermo del dispositivo.

Potrebbe qualcuno mi punto nella giusta direzione con questo?

Ecco le implementazioni di metodo nativo:

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);
}

L'output di log è:

init () disegnare() disegnare() disegnare() etc ..

È stato utile?

Soluzione 2

ho finalmente trovato il problema dopo armeggiare MOLTO.

Si scopre che perché stavo chiamando il codice da un GLSurfaceView.Renderer in Java il frame buffer esisteva già e così chiamando:

glGenFramebuffersOES(1, &framebuffer);

ero involontariamente alloca un nuovo buffer che non è stato attaccato alla visualizzazione di destinazione. Rimuovendo questa linea e la sua sostituzione con:

framebuffer = (GLuint) 0;

Ora rende al buffer corretto e visualizza correttamente sullo schermo. Nota che, anche se non ho davvero usare il buffer in questo frammento, cambiando è quello che incasinato la corretta visualizzazione.

Altri suggerimenti

Non credo che questa sia una soluzione reale a tutti.

Sto avendo lo stesso problema qui, utilizzando gli oggetti framebuffer all'interno codice nativo, e facendo

framebuffer = (GLuint) 0;

si sta utilizzando solo il frame buffer di default, che esiste sempre ed è riservato a 0. Tecnicamente, si potrebbe cancellare tutto il codice relative al framebuffer e la vostra applicazione dovrebbe funzionare correttamente come framebuffer 0 viene sempre generata e quella rilegata con il default.

Ma, si dovrebbe essere in grado di generare più frame buffer e di scambio tra di loro utilizzando la funzione di legame (glBindFramebuffer) come ti pare. Ma questo non sembra essere al lavoro su mia fine e non ho ancora trovato la vera soluzione. Non c'è molta documentazione da parte di Android, e sto iniziando a chiedermi se FBO sono realmente supportati in codice nativo. Fanno il lavoro correttamente all'interno del codice Java, però, ho provato con successo!

Oh! E ho appena notato che le dimensioni del buffer non sono potenza di 2 ... che di solito dovrebbe essere il caso per tutte le texture / buffer come la struttura in OpenGL.


UPDATE:

Ora sono abbastanza sicuro non è possibile utilizzare OSA con Android (2.2 o inferiore) e NDK (versione R5B o inferiore). Si tratta di un gioco completamente diverso se si utilizza la nuova versione 3.1, però, in cui è possibile codificare tutte le vostre app con codice nativo (involucro non più JNI necessario), ma non ho ancora provato!

D'altra parte, ho riesco a fare i buffer Stencil e texture lavoro in modo impeccabile! Così la soluzione sarà quella di utilizzare quelli per la mia logica di rendering, e solo dimenticare FBO fuori campo del rendering.

Ho avuto problemi simili quando si spostano iOS forma ad Android NDK ecco la mia soluzione completa anche.

OpenGLES 1.1 con FrameBuffer / ColorBuffer / DepthBuffer per Android con NDK R7B

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top