Визуализация в Framebuffer в OpenGL ES на Android с QT

0

Я пытаюсь сделать в объекте FBO с QT 5.2, на ПК все работает отлично, но Mobile-Screen остается черным. КСТАТИ. Это телефон Android.

Здесь код для инициализации:

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

Надеюсь, я понимаю, что я пытаюсь сделать здесь...

EDIT: Снято 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 () в ваш код.
  • 0
    С этим я получаю INVALID_ENUM_TYPE
Показать ещё 1 комментарий
Теги:
qt
opengl-es

1 ответ

0

Проблема, вероятно, вызвана следующим:

Qt Android. Получить разрешение экрана устройства

И это:

Ошибки после изменения кода OpenGL с ES 1.0 до ES 2.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню