2014-02-28 66 views
0

我一直試圖在QT中使用OpenGL和着色器和一個簡單的頂點數組。我基本上希望在屏幕中間畫一個平原,但是當我運行該程序時沒有出現。我將我的代碼放在Qt的「紋理」示例中,一切看起來都一樣,但它不起作用!OpenGL + Qt 4.8並沒有繪製任何東西

這裏是我的glwidget.cpp的代碼:

#include "glwidget.h" 

GLWidget::GLWidget(QWidget *parent):QGLWidget(parent) 
{ 
    timer.start(10); 
    //connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL())); 

    Object aux; 

    QVector3D auxV; 
    auxV.setX(0.4); auxV.setY(0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    auxV.setX(0.4); auxV.setY(-0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    Objects.append(aux); 
} 

GLWidget::~GLWidget() 
{ 
} 

void GLWidget::initializeGL() 
{ 
    #define PROGRAM_VERTEX_ATTRIBUTE 0 

    printf("Objects Size: %d\nObj1 Size: %d\n", Objects.size(), Objects.at(0).vertices.size()); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 

    //printf("Version: %s\n", glGetString(GL_VERSION)); 

    vShader= new QGLShader (QGLShader::Vertex, this); 
    vShader->compileSourceFile("../src/shaders/editorVshader.glsl"); 

    fShader= new QGLShader (QGLShader::Fragment, this); 
    fShader->compileSourceFile("../src/shaders/editorFshader.glsl"); 

    editor= new QGLShaderProgram (this); 
    editor->addShader(vShader); 
    editor->addShader(fShader); 
    editor->bindAttributeLocation("vertices", PROGRAM_VERTEX_ATTRIBUTE); 
    editor->link(); 
    editor->bind(); 
} 

void GLWidget::paintGL() 
{ 
    glClearColor(0.4765625, 0.54296875, 0.6171875, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 
    glTranslatef(0.0f, 0.0f, -10.0f); 

    glVertexPointer(3, GL_FLOAT, 0, Objects.at(0).vertices.constData()); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    QMatrix4x4 auxM; 
    auxM.ortho(-0.5, 0.5, 0.5, -0.5, 4.0, -15.0); 
    auxM.translate(0.0f, 0.0f, -10.0f); 
    editor->setUniformValue("modelmatrix", auxM); 

    editor->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE); 

    //editor->enableAttributeArray(editor->attributeLocation("vertices")); 
    //editor->setAttributeArray(editor->attributeLocation("vertices"), Objects.at(0).vertices.constData(), 3); 

    editor->setAttributeArray (PROGRAM_VERTEX_ATTRIBUTE, Objects.at(0).vertices.constData()); 
    glDrawArrays(GL_QUADS, 0, 4); 
} 

void GLWidget::resizeGL(int w, int h) 
{ 
    int side = qMin(w, h); 
    glViewport((w - side)/2, (h - side)/2, side, side); 

    //glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-0.5, 0.5, -0.5, 0.5, 4.0, -15.0); 
    glMatrixMode(GL_MODELVIEW); 
    updateGL(); 
} 

這裏是我的vShader:

attribute highp vec4 vertices; 
attribute highp mat4x4 modelmatrix; 

void main (void) 
{ 
gl_Position= modelmatrix*vertices; 
} 

而且我fShader:

void main(void) 
{ 
    gl_FragColor= vec4(0.0, 0.1, 1.0, 1.0); 
} 

你看到的錯誤那裏?

+0

您的着色器完全令人困惑。 'highp'精度限定符在GLSL 1.10中不可用,同樣在1.10中不存在'mat4x4'。你至少需要包含'#version 120'。您是否嘗試將OpenGL ES着色器與桌面GL混合搭配? –

+0

你是對的,mat4x4是錯的。我改變了這一點。但是我使用的基本上和上面例子一樣的着色器,他們甚至都沒有使用#version的東西(我在Qt的其他程序中也使用過),它們工作,我的不工作。 – BlastDV

+0

我剛剛注意到的其他事情是,modelmatrix被作爲統一值傳遞,而不是作爲屬性傳遞。它已被更改,但仍無法使用。 – BlastDV

回答

0

我發現問題所在。

你說得對,prabindh,我在混合OpenGL版本,問題與此有關。在從OpenGL ES指令中清除代碼後,我還添加了模型,視圖和投影矩陣,以便將它們傳遞給着色器。有效!事實上,我認爲這架飛機一直都在那裏,但我根本看不到它,因爲「相機瞄準了別的地方」。

但我沒有混合這些例子,我將所有的代碼都放在紋理例子中。我仍然不明白爲什麼它的代碼有效,而我的代碼沒有。但無論如何,之後一切都很順利。

感謝您的回答和您的意見!

相關問題