简体   繁体   English

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

[英]Fail to generate a triangle by openGL with Qt5.0.2

OS : mac osx 10.8.3 作业系统:mac osx 10.8.3


compiler : clang3.2 编译器:clang3.2


I am a beginner of opengl, trying to play opengl with Qt5 我是opengl的初学者,尝试通过Qt5玩opengl

There are two problems about this simple program(plot a triangle) 这个简单的程序有两个问题(画一个三角形)

  1. I can't see the triangle 我看不到三角形

  2. The program could not exit even I close the window 即使关闭窗口,程序也无法退出

hpp 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 .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 main.cpp

#include <QApplication>

#include "ch1HelloTriangle.hpp"

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

    ch1HelloTriangle ch1;
    ch1.show();

    return a.exec();
}

After a lot of trial and error, I solved the problem. 经过大量的反复试验,我解决了问题。

Change two things : 1 : read the shader by files 更改两件事: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 : change the fragment shader, remove the output variable 2:更改片段着色器,删除输出变量

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

From the websites, "modern opengl": http://www.arcsynthesis.org/gltut/ and "another site":tomdalling.com/blog/modern-opengl/01-getting-started-in-xcode-and-visual-cpp/ 从网站“现代opengl”: http : //www.arcsynthesis.org/gltut/和“另一个站点”:tomdalling.com/blog/modern-opengl/01-getting-started-in-xcode-and-visual -cpp /

The output qualify should exist(atleast the codes of the second website will work on my pc) But Qt will throw error message 输出合格应该存在(至少第二个网站的代码将在我的PC上运行)但是Qt会抛出错误消息

QOpenGLShader::FragmentERROR: 0:4: Invalid qualifiers 'out' in global variable context QOpenGLShader :: FragmentERROR:0:4:无效的限定符在全局变量上下文中“输出”

Do anyone know why?Thanks 有人知道为什么吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM