0

操作系统:mac osx 10.8.3


编译器:clang3.2


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

这个简单的程序有两个问题(画一个三角形)

  1. 我看不到三角形

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

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

主文件

#include <QApplication>

#include "ch1HelloTriangle.hpp"

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

    ch1HelloTriangle ch1;
    ch1.show();

    return a.exec();
}
4

1 回答 1

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”

有谁知道为什么?谢谢

于 2013-05-08T03:21:51.807 回答