2015-11-11 1 views
1

vous êtes mon dernier recours pour cette question parce que je suis à court d'idées. Donc tout d'abord j'ai déjà fait quelques trucs openGL mais pas avec les bibliothèques Qt.QOpenGLWidget ne dessine pas le tableau

Et comme je dois le faire avec les bibliothèques Qt à cause du compilateur Qt Android, il n'y a pas de solution pour moi. Donc, j'essayais de dessiner quelques coordonnées de vertex comme en openGL normal. Enregistrer des points dans le tableau flottant, etc. Donc, j'ai houblonné le bon vao, vbo .. shader .. mais ça ne dessinera rien. paintGL() ne dessine quelque chose que s'il est codé en dur avec glBegin et end. S'il vous plaît dites-moi où je me suis trompé et libérez-moi de ma souffrance ^^ Ah et oui il ya déjà des questions comme la mienne Here mais il n'y avait pas de réponse, donc je veux l'essayer à nouveau.

--MainWidget tête:

#ifndef MAINWIDGET_H 
#define MAINWIDGET_H 

#include <QOpenGLWidget> 
#include <QOpenGLFunctions> 
#include <QVector2D> 
#include <QOpenGLShaderProgram> 
#include <QOpenGLBuffer> 
#include <QVector3D> 
#include <QOpenGLVertexArrayObject> 


class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions 
{ 
    Q_OBJECT 

public: 
    MainWidget(QWidget *parent = 0); 
    ~MainWidget(); 


protected: 
    void initializeGL() Q_DECL_OVERRIDE; 
    void resizeGL(int w, int h) Q_DECL_OVERRIDE; 
    void paintGL() Q_DECL_OVERRIDE; 

    GLfloat vertices[9]; 



private: 
    QOpenGLShaderProgram program; 
    QOpenGLBuffer arrayBuf; 
    QOpenGLVertexArrayObject vertexArrayID; 

}; 

#endif // MAINWIDGET_H 

- MainWidget Cpp:

#include "mainwidget.h" 


MainWidget::MainWidget(QWidget *parent): QOpenGLWidget(parent){ 

} 
MainWidget::~MainWidget(){ 

} 

void MainWidget::initializeGL(){ 
    initializeOpenGLFunctions(); 
    glClearColor(0, 0, 0.4f, 0); 
    glEnable(GL_DEPTH_TEST); 
    //glEnable(GL_CULL_FACE); 

    static const GLfloat g_vertex_buffer_data[] = { 
     -1.0f, -1.0f, 0.0f, 
     1.0f, -1.0f, 0.0f, 
     0.0f, 1.0f, 0.0f 
    }; 
    for(int i = 0; i < 9; i++){ 
     vertices[i] = g_vertex_buffer_data[i]; 
    } 

    vertexArrayID.create(); 
    vertexArrayID.bind(); 
    program.addShaderFromSourceFile(QOpenGLShader::Vertex, "vertex.vert"); 
    program.addShaderFromSourceFile(QOpenGLShader::Fragment, "fragment.frag"); 
    program.link(); 
    program.bind(); 
    arrayBuf.create(); 
    arrayBuf.bind(); 
    arrayBuf.allocate(&vertices, 9 * sizeof(GLfloat)); 
    /* glGenBuffers(1, &arrayBuf); 
    glBindBuffer(GL_ARRAY_BUFFER, arrayBuf);*/ 
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); 


} 
void MainWidget::resizeGL(int w, int h){ 

} 

void MainWidget::paintGL(){ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    arrayBuf.bind(); 
    arrayBuf.allocate(&vertices, 9*sizeof(GLfloat)); 



    int vertexLocation = program.attributeLocation("vertex"); 
    program.enableAttributeArray("vertexLocation"); 
    program.setAttributeBuffer(vertexLocation, GL_FLOAT, 0, 3, sizeof(GLfloat)); 

    //glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDisableVertexAttribArray(0); 

} 

--Main Cpp:

#include <QApplication> 
#include <QLabel> 
#include <QSurfaceFormat> 

#ifndef QT_NO_OPENGL 
#include "mainwidget.h" 
#endif 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QSurfaceFormat format; 
    format.setDepthBufferSize(24); 
    QSurfaceFormat::setDefaultFormat(format); 

    app.setApplicationName("GLtest"); 

#ifndef QT_NO_OPENGL 
    MainWidget widget; 
    widget.show(); 
#else 
    QLabel note("OpenGL Support required"); 
    note.show(); 
#endif 
    return app.exec(); 
} 

--Vertex Shader aussi facile que possible:

#version 330 

layout(location = 0) in vec3 vertex; 

void main(){ 
    gl_Position = vec4(vertex, 1.0); 
} 

--fragment Shader:

#version 330 
out vec3 color; 
void main(){ 
    color = vec3(1,0,0); 
} 

Merci à l'avance .. tout type d'aide est la bienvenue! Vive

Répondre

0

Vous activez le mauvais attribut sommet:

program.enableAttributeArray("vertexLocation"); 

Il devrait être soit (non disparus «)

program.enableAttributeArray(vertexLocation); 

ou (nom correct)

program.enableAttributeArray("vertex"); 
+0

sainte mère ... merci beaucoup! maintenant je me sens stupide de demander –

+0

Np, si cela a résolu votre problème, vous pouvez accepter la réponse :) – BDL