使用Qt5.0.2的openGL无法生成三角形

时间:2013-05-07 03:46:21

标签: c++ qt opengl

OS:mac osx 10.8.3


编译器:clang3.2


我是opengl的初学者,尝试用Qt5播放opengl

这个简单的程序存在两个问题(绘制三角形)

  1. 我看不到三角形

  2. 即使我关闭窗口,程序也无法退出

  3. HPP

    #include <QGLWidget>
    
    #include <QtGui/QOpenGLFunctions>
    #include <QtGui/QOpenGLShaderProgram>
    
    class QWidget;
    
    class ch1HelloTriangle : public QGLWidget, protected QOpenGLFunctions
    {
        Q_OBJECT
    public:
        explicit ch1HelloTriangle(QWidget *parent = 0);
    
    protected:
        virtual void initializeGL();
        void initShaders();
        void InitializeVertexBuffer();
    
        virtual void resizeGL(int w, int h);
        virtual void paintGL();
    
    private:
        QOpenGLShaderProgram program;
    
        GLuint positionBufferObject;
    };
    

    的.cpp

    #include <locale.h>
    
    #include <QWidget>
    
    #include "ch1HelloTriangle.hpp"
    
    namespace
    {
    
    float const vertexPositions[] = {
        0.75f,  0.75f, 0.0f, 1.0f,
        0.75f, -0.75f, 0.0f, 1.0f,
        -0.75f, -0.75f, 0.0f, 1.0f,
    };
    
    }
    
    ch1HelloTriangle::ch1HelloTriangle(QWidget *parent) :
        QGLWidget(parent)
    {
    }
    
    void ch1HelloTriangle::initializeGL()
    {
        initializeOpenGLFunctions();
        InitializeVertexBuffer();
        initShaders();
    }
    
    void ch1HelloTriangle::initShaders()
    {
        // Override system locale until shaders are compiled
        setlocale(LC_NUMERIC, "C");
    
        // Compile vertex shader
        if (!program.addShaderFromSourceCode(QOpenGLShader::Vertex,
                                             "attribute vec4 position;\n"
                                             "void main()\n"
                                             "{\n"
                                             "   gl_Position = position;\n"
                                             "}\n"))
        {
            close();
        }
    
        // Compile fragment shader
        if (!program.addShaderFromSourceCode(QOpenGLShader::Fragment,
                                             "out vec4 outputColor;\n"
                                             "void main()\n"
                                             "{\n"
                                             "   outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n"
                                             "}\n"))
        {
            close();
    
        }
    
        // Link shader pipeline
        if (!program.link())
            close();
    
        // Bind shader pipeline for use
        if (!program.bind())
            close();
    
        // Restore system locale
        setlocale(LC_ALL, "");
    }
    
    void ch1HelloTriangle::InitializeVertexBuffer()
    {
        glGenBuffers(1, &positionBufferObject);
    
        glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }
    
    void ch1HelloTriangle::resizeGL(int w, int h)
    {
        // Set OpenGL viewport to cover whole widget
        glViewport(0, 0, w, h);
    }
    
    void ch1HelloTriangle::paintGL()
    {        
         /*
         //codes propose by http://stackoverflow.com/questions/13111291/displaying-a-triangle-with-qt-and-opengl?rq=1, can't see the triangle either
         QSize viewport_size = size();
         glViewport(0, 0, viewport_size.width(), viewport_size.height());
    
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         glFrustum(-1, 1, -1, 1, 5, 7); // near and far match your triangle Z distance
    
         glMatrixMode(GL_MODELVIEW);*/
    
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    
        int vertexLocation = program.attributeLocation("position");
        program.enableAttributeArray(vertexLocation);
    
        glVertexAttribPointer(vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
    
        glDrawArrays(GL_TRIANGLES, 0, 3);    
    }
    

    的main.cpp

    #include <QApplication>
    
    #include "ch1HelloTriangle.hpp"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        ch1HelloTriangle ch1;
        ch1.show();
    
        return a.exec();
    }
    

1 个答案:

答案 0 :(得分:0)

经过大量的反复试验,我解决了这个问题。

改变两件事: 1:按文件读取着色器

// Compile vertex shader
    if (!program.addShaderFromSourceFile(QOpenGLShader::Vertex, "modernOpenGLShader/ch1/vertex")){
        QMessageBox::warning(this, "QOpenGLShader::Vertex", "QOpenGLShader::Vertex" + program.log());
        close();      
    }

    // Compile fragment shader
    if (!program.addShaderFromSourceFile(QOpenGLShader::Fragment, "modernOpenGLShader/ch1/frag")){
        QMessageBox::warning(this, "QOpenGLShader::Fragment", "QOpenGLShader::Fragment" + program.log());
        close();    
    }

2:更改片段着色器,删除输出变量

void main() {
    //set every drawn pixel to white
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

从网站上看,“现代opengl”:http://www.arcsynthesis.org/gltut/ 和“另一个网站”:tomdalling.com/blog/modern-opengl/01-getting-started-in-xcode-and-visual-cpp /

输出限定应该存在(至少第二个网站的代码可以在我的电脑上使用) 但Qt会抛出错误信息

QOpenGLShader :: FragmentERROR:0:4:全局变量上下文中的限定符'out'无效

有谁知道为什么?谢谢