0

OS:マックOSX 10.8.3


コンパイラ: clang3.2


私はopenglの初心者で、Qt5でopenglをプレイしようとしています

この単純なプログラムには 2 つの問題があります (三角形をプロットする)。

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

main.cpp

#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

試行錯誤の末、問題を解決しました。

2 つの変更: 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);
}

Web サイトから、「モダンな opengl」: http://www.arcsynthesis.org/gltut/ および「別のサイト」:tomdalling.com/blog/modern-opengl/01-getting-started-in-xcode-and-visual -cpp/

出力修飾が存在する必要があります (少なくとも 2 番目の Web サイトのコードは私の PC で動作します)。ただし、Qt はエラー メッセージをスローします。

QOpenGLShader::FragmentERROR: 0:4: グローバル変数コンテキストで無効な修飾子 'out'

誰かが理由を知っていますか?ありがとう

于 2013-05-08T03:21:51.807 に答える