2014-12-27 157 views
0

我尝试使用QT 5.2渲染FBO对象,在PC上一切正常,但移动屏幕保持黑屏。 BTW。这是一部Android手机。使用QT渲染到Android上的OpenGL ES中的帧缓冲器

下面是该initalisation代码:

GLANN::GLANN(unsigned int width, unsigned int height, unsigned int renderPasses, Scene *renderScene, 
      QWidget *parent, QGLWidget *shareWidget) 
     : QGLWidget(parent, shareWidget) 
{ 
    makeCurrent(); 

    setFixedWidth(width); 
    setFixedHeight(height); 
    this->width = width; 
    this->height = height; 

    qsrand((uint)QTime::currentTime().msec()); 

    mScene = renderScene; 
    SceneImage = renderScene->getSceneImage(); 
    numObjects = SceneImage->width(); 
    renderedImage = new Playground(texSize,texSize); 
} 

void GLANN::initializeGL(){ 
    setAutoBufferSwap(true); 

    initializeGLFunctions(); 

    glEnable(GL_CULL_FACE); 

    glClearColor(0.0, 0.0, 0.0, 0.0); 

    initShader(); 
    initTextures(); 

    // Generate 2 VBOs 
    glGenBuffers(1, &vboId0); 
    glGenBuffers(1, &vboId1); 

    VertexData vertices[] = { 
     // Vertex data for face 0 
       {QVector3D(-1.0, -1.0, 1.0), QVector2D(0.0, 0.0)}, // v0 
       {QVector3D(1.0, -1.0, 1.0), QVector2D(1.0, 0.0)}, // v1 
       {QVector3D(-1.0, 1.0, 1.0), QVector2D(0.0, 1.0)}, // v2 
       {QVector3D(1.0, 1.0, 1.0), QVector2D(1.0, 1.0)}, // v3 
    }; 
    // Transfer vertex data to VBO 0 
    glBindBuffer(GL_ARRAY_BUFFER, vboId0); 
    glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(VertexData), vertices, GL_STATIC_DRAW); 

    GLushort indices[] = { 
        0, 1, 2, 3, 3, 
    }; 
    // Transfer index data to VBO 1 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 5 * sizeof(GLushort), indices, GL_STATIC_DRAW); 

    //Init the Framebuffer 
    initFbo(); 

    // Use QBasicTimer because its faster than QTimer 
    timer.start(0, this); 
} 

bool GLANN::initFbo(){ 
    fbo = new QOpenGLFramebufferObject(texSize, texSize); 
    return true; 
} 

这里的渲染:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// Set random seed 
program.setUniformValue("seedX", ((float)qrand()/RAND_MAX)); 
program.setUniformValue("seedY", ((float)qrand()/RAND_MAX)); 

//Set number of alredy rendered passes 
program.setUniformValue("numRenderPass",mRenderPasses); 

//Set program to fbo render mode 
program.setUniformValue("fbo",true); 

//Bind last rendered Image 
//pixelsRenderedImage = bindTexture(*renderedImage); 

//Load Identity 
//glLoadIdentity(); 

//Move to rendering point 
//glTranslatef(-1.0, -1.0, 0.0f); 

// Draw geometry 
// Tell OpenGL which VBOs to use 

// Render to our framebuffer 
fbo->bind(); 
glViewport(0,0,texSize,texSize); 

// Tell OpenGL which VBOs to use 
glBindBuffer(GL_ARRAY_BUFFER, vboId0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1); 

// Offset for position 
int offset = 0; 

// Tell OpenGL programmable pipeline how to locate vertex position data 
int vertexLocation = program.attributeLocation("a_position"); 
program.enableAttributeArray(vertexLocation); 
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset); 

// Offset for texture coordinate 
offset += sizeof(QVector3D); 

// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data 
int texcoordLocation = program.attributeLocation("a_texcoord"); 
program.enableAttributeArray(texcoordLocation); 
glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset); 

glEnable(GL_TEXTURE_2D); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage); 

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, pixelsScene); 

glActiveTexture(GL_TEXTURE2); 
glBindTexture(GL_TEXTURE_2D, pixelsRandom); 

// Draw cube geometry using indices from VBO 1 
glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0); 

fbo->release(); 


pixelsRenderedImage = fbo->takeTexture(); 
//Set Program to screen frendering 
program.setUniformValue("fbo",false); 
//Set Viewport back to default 
glViewport(0,0,width,height); 
//Render To Screen 
glEnable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage); 

// Draw quad geometry using indices from VBO 1 
glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0); 

希望这是清楚我trining在这里做...

编辑:删除glEnable(TEXTURE_2D)。 仍然得到一个黑屏但没有错误glError();

GLANN::GLANN(unsigned int width, unsigned int height, unsigned int renderPasses, Scene *renderScene, 
      QWidget *parent, QGLWidget *shareWidget) 
     : QGLWidget(parent, shareWidget) 
{ 

    setFixedWidth(width); 
    setFixedHeight(height); 
    this->width = width; 
    this->height = height; 

    qsrand((uint)QTime::currentTime().msec()); 

    mScene = renderScene; 
    SceneImage = renderScene->getSceneImage(); 
    numObjects = SceneImage->width(); 
    renderedImage = new Playground(texSize,texSize); 
} 

void GLANN::initializeGL(){ 
    //setAutoBufferSwap(true); 

    makeCurrent(); 
    initializeGLFunctions(); 

    qDebug() << glGetError() << "Line 28"; 

    //glEnable(GL_CULL_FACE); 

    glClearColor(0.0, 0.0, 0.0, 0.0); 

    initShader(); 

    qDebug() << glGetError() << "Line 36"; 

    initTextures(); 

    qDebug() << glGetError() << "Line 40"; 

    // Generate 2 VBOs 
    glGenBuffers(1, &vboId0); 
    glGenBuffers(1, &vboId1); 

    VertexData vertices[] = { 
     // Vertex data for face 0 
       {QVector3D(-1.0, -1.0, 1.0), QVector2D(0.0, 0.0)}, // v0 
       {QVector3D(1.0, -1.0, 1.0), QVector2D(1.0, 0.0)}, // v1 
       {QVector3D(-1.0, 1.0, 1.0), QVector2D(0.0, 1.0)}, // v2 
       {QVector3D(1.0, 1.0, 1.0), QVector2D(1.0, 1.0)}, // v3 
    }; 
    // Transfer vertex data to VBO 0 
    glBindBuffer(GL_ARRAY_BUFFER, vboId0); 
    glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(VertexData), vertices, GL_STATIC_DRAW); 

    GLushort indices[] = { 
        0, 1, 2, 3, 3, 
    }; 
    // Transfer index data to VBO 1 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 5 * sizeof(GLushort), indices, GL_STATIC_DRAW); 

    qDebug() << glGetError() << "Line 57"; 

    //Init the Framebuffer 
    initFbo(); 

    qDebug() << glGetError() << "Line 62"; 

    // Use QBasicTimer because its faster than QTimer 
    timer.start(0, this); 
} 

bool GLANN::initFbo(){ 
    fbo = new QOpenGLFramebufferObject(texSize, texSize); 
    return true; 
} 

void GLANN::resizeGL(int w, int h){ 
    glViewport(0,0,w,h); 
} 

void GLANN::mouseMoveEvent(QMouseEvent* event){ 
    if(event->buttons() == Qt::LeftButton){ 
     LineObject newPoly(xTemp,yTemp, 1.0f*event->pos().x()/width, 1.0f-1.0f*event->pos().y()/width,qRgba(255,255,255,255),0.4,0.5,0.3,0.0); 
     mScene->addObject(newPoly); 

     SceneImage = mScene->getSceneImage(); 
     numObjects = SceneImage->width(); 

     //Bind WeightmapTexture 
     pixelsScene = QGLWidget::bindTexture(*SceneImage); 

     qDebug() << xTemp << yTemp << numObjects; 

     //Bind last rendered Image 
     renderedImage->fill(qRgba(0,0,0,255)); 
     pixelsRenderedImage = bindTexture(*renderedImage); 

     mRenderPasses = 0; 

     // Set number of Objects 
     program.setUniformValue("numObjects",numObjects); 

     xTemp = 1.0f*event->pos().x()/width; 
     yTemp = 1.0f-1.0f*event->pos().y()/height; 
    } 
} 

void GLANN::mousePressEvent(QMouseEvent* event){ 
    if(event->button() == Qt::LeftButton){ 
      xTemp = 1.0f*event->pos().x()/width; 
      yTemp = 1.0f-1.0f*event->pos().y()/height; 
     } 
} 

void GLANN::paintGL(){ 

    render(); 

    //getFeedbackTexture(); 

    //increment number of rendered passes 
    mRenderPasses++; 
} 

void GLANN::render(){ 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

     // Set random seed 
     program.setUniformValue("seedX", ((float)qrand()/RAND_MAX)); 
     program.setUniformValue("seedY", ((float)qrand()/RAND_MAX)); 

     //Set number of alredy rendered passes 
     program.setUniformValue("numRenderPass",mRenderPasses); 

     //Set program to fbo render mode 
     program.setUniformValue("fbo",true); 

     //Bind last rendered Image 
     //pixelsRenderedImage = bindTexture(*renderedImage); 

     //Load Identity 
     //glLoadIdentity(); 

     //Move to rendering point 
     //glTranslatef(-1.0, -1.0, 0.0f); 

     // Draw geometry 
     // Tell OpenGL which VBOs to use 

     // Render to our framebuffer 
     fbo->bind(); 
     glViewport(0,0,texSize,texSize); 

     // Tell OpenGL which VBOs to use 
     glBindBuffer(GL_ARRAY_BUFFER, vboId0); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1); 

     // Offset for position 
     int offset = 0; 

     // Tell OpenGL programmable pipeline how to locate vertex position data 
     int vertexLocation = program.attributeLocation("a_position"); 
     program.enableAttributeArray(vertexLocation); 
     glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset); 

     // Offset for texture coordinate 
     offset += sizeof(QVector3D); 

     // Tell OpenGL programmable pipeline how to locate vertex texture coordinate data 
     int texcoordLocation = program.attributeLocation("a_texcoord"); 
     program.enableAttributeArray(texcoordLocation); 
     glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset); 

     qDebug() << glGetError() << "Line 167"; 

     //glEnable(GL_TEXTURE_2D); 

     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage); 

     glActiveTexture(GL_TEXTURE1); 
     glBindTexture(GL_TEXTURE_2D, pixelsScene); 

     glActiveTexture(GL_TEXTURE2); 
     glBindTexture(GL_TEXTURE_2D, pixelsRandom); 

     // Draw cube geometry using indices from VBO 1 
     glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0); 

     qDebug() << glGetError() << "Line 183"; 

     fbo->release(); 


    pixelsRenderedImage = fbo->texture(); 
    //Set Program to screen frendering 
    program.setUniformValue("fbo",false); 
    //Set Viewport back to default 
    glViewport(0,0,width,height); 
    //Render To Screen 
    //glEnable(GL_TEXTURE_2D); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage); 

    // Draw quad geometry using indices from VBO 1 
    glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0); 

    qDebug() << glGetError(); 


} 
+0

尝试呈现没有FBO。尝试在Android AVD上运行。将一些glGetError()和eglGetError()检查添加到您的代码中。 – ClayMontgomery 2014-12-28 18:28:33

+0

有了这即时得到一个INVALID_ENUM_TYPE – schwenk 2014-12-29 13:28:43

+0

在glEnable(TEXTURE_2D)中发现一个错误,但它仍然无法正常工作 – schwenk 2014-12-29 16:14:39

回答