簡體   English   中英

運行 QT hello opengl 時出現“着色器程序未鏈接”

[英]“shader program is not linked” when running QT hello opengl

我已經從http://releases.qt-project.org/learning/developerguides/qtopengltutorial/OpenGLTutorial.pdf下載了一個 QT OpenGL 教程,並試圖運行他們在那里的最簡單的例子,它只是在上面畫一個三角形黑色背景。

我設法編譯了這個例子,但是當我運行它時,我只得到一個黑色窗口,控制台報告以下內容:

啟動 /home/minas/Desktop/hello-opengl-build-Desktop_Qt_5_0_1_GCC_64bit-Debug/hello-opengl... QGLShaderProgram::uniformLocation( mvpMatrix ): 着色器程序未鏈接 QGLShaderProgram::uniformLocation( color ): 着色器程序未鏈接QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::uniformLocation( mvpMatrix ): 着色器程序是未鏈接 QGLShaderProgram::uniformLocation( color ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::uniformLocation( mvpMatrix ): 着色器程序未鏈接 QGLShaderProgram::uniformLocation( color ): 着色器程序未鏈接 ed QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::uniformLocation( mvpMatrix ): 着色器程序未鏈接 QGLShaderProgram::uniformLocation( color ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ): 着色器程序未鏈接 QGLShaderProgram::attributeLocation( vertex ):着色器程序未鏈接

.pro 文件看起來像這樣(“unix:!mac”部分是我添加的,所以它會找到 OpenGL .so 文件)。

QT += core gui opengl

TARGET = hello-opengl

TEMPLATE = app

SOURCES += main.cpp\
           glwidget.cpp

HEADERS += glwidget.h

OTHER_FILES += fragmentShader.fsh\
               vertexShader.vsh

RESOURCES += resources.qrc

unix:!mac{
    QMAKE_LFLAGS += -Wl,--rpath=/usr/lib64/nvidia-current
    QMAKE_LFLAGS += -L/usr/lib64/nvidia-current
}

“glxinfo | grep -i opengl”的輸出是

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce 9800 GT/PCIe/SSE2
OpenGL version string: 2.1.2 NVIDIA 304.64
OpenGL shading language version string: (null)
OpenGL extensions:

進行實際渲染的代碼部分是

void GlWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    QMatrix4x4 mMatrix;
    QMatrix4x4 vMatrix;

    // shaderProgram initialized in initializeGL()    
    shaderProgram.bind();

    // "mvpMatrix", "color" and "vertex" do exist in the shaders

    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);

    shaderProgram.setUniformValue("color", QColor(Qt::white));

    shaderProgram.setAttributeArray("vertex", vertices.constData());
    shaderProgram.enableAttributeArray("vertex");

    glDrawArrays(GL_TRIANGLES, 0, vertices.size());

    shaderProgram.disableAttributeArray("vertex");

    shaderProgram.release();
}

另外,作為一個附帶問題,為什么“glxinfo | grep -i opengl”的輸出包含該行

OpenGL 着色語言版本字符串:(空)

(似乎與我有關......是嗎?)


編輯 1

shaderProgram在我的QGLWidget子類中聲明,我稱之為GLWidget並在initializeGLinitializeGL如下:

void GlWidget::initializeGL()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    qglClearColor(QColor(Qt::black));

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();

    vertices << QVector3D(1, 0, -2) << QVector3D(0, 1, -2) << QVector3D(-1, 0, -2);
}

編輯 2

這是我的 initializeGL() 方法:

void GlWidget::initializeGL()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    qglClearColor(QColor(Qt::black));

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();

    vertices << QVector3D(1, 0, -2) << QVector3D(0, 1, -2) << QVector3D(-1, 0, -2);
}

和把

qDebug() << shaderProgram.log();
exit(0);

在調用上面的 link() 之后立即不會產生任何輸出。

剛剛看到這個。 很奇怪,因為link()返回 true,但它聲稱程序沒有鏈接?

結果我需要在我的link()調用之前移動兩個bindAttributeLocation()語句。 顯然,如果在程序鏈接后使用bindAttributeLocation() ,它將導致程序不再鏈接。

錯誤的:

    program.link();

    program.bindAttributeLocation("position", 0);
    program.bindAttributeLocation("texcoord", 1);

對:

    program.bindAttributeLocation("position", 0);
    program.bindAttributeLocation("texcoord", 1);

    program.link();

// 在類構造函數中初始化了 shaderProgram

如果您在類構造函數中編譯和鏈接着色器源文件,那么這很可能是罪魁禍首。 您應該覆蓋 QGLWidget 的 initializeGL 成員並在那里對 OpenGL 對象進行初始化。 由於尚未建立 OpenGL 上下文,因此您無法更早地執行此操作,因此您無法創建或管理任何 OpenGL 對象。

我也發現了這個問題,我只是使用FromSourceCode而不是FromSourceFile像這樣:

shaderProgram.addShaderFromSourceCode(QGLShader::Fragment,  "uniform vec4 color;\n"
                                      "out vec4 fragColor;\n"
                                      "void main(void)\n"
                                      "{\n"
                                      "   fragColor = color;\n"
                                      "}");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM