C++ 自升级到Qt5后,QGLShaderProgram将不会编译任何着色器

C++ 自升级到Qt5后,QGLShaderProgram将不会编译任何着色器,c++,qt,opengl,shader,qt5,C++,Qt,Opengl,Shader,Qt5,我发现QGLShaderProgram始终无法编译任何着色器,并且没有提供错误日志。以下是症状: QGLShaderProgram报告它未能编译,但生成一个空的错误日志。如果我尝试绑定着色器,将引发异常 我可以使用glCompileShader毫无问题地编译着色器。但是,在QGLShaderProgram失败后,我第一次尝试以这种方式编译时,失败了,错误日志如下: 错误:错误(#270)内部错误:错误的符号表级别 错误:0:2:错误(#232)函数声明不能发生在函数内部: 主要 错误:错误(#

我发现QGLShaderProgram始终无法编译任何着色器,并且没有提供错误日志。以下是症状:

  • QGLShaderProgram报告它未能编译,但生成一个空的错误日志。如果我尝试绑定着色器,将引发异常
  • 我可以使用
    glCompileShader
    毫无问题地编译着色器。但是,在QGLShaderProgram失败后,我第一次尝试以这种方式编译时,失败了,错误日志如下:

    错误:错误(#270)内部错误:错误的符号表级别
    错误:0:2:错误(#232)函数声明不能发生在函数内部:
    主要
    错误:错误(#273)2个编译错误。没有生成代码

    在这一次失败之后,下次我尝试使用
    glCompileShader
    进行编译时工作正常

  • 该问题仅在从Qt4.8升级到5.2之后才出现。这台机器上没有其他变化

  • 我在两台PC上进行了测试,一台使用ATI Radeon HD 5700,另一台使用AMD FirePro V7900。此问题仅出现在Radeon PC上
下面是我的测试代码,演示了问题:

main.cpp

#include <QApplication>
#include "Test.h"

int main(int argc, char* argv[])
{
    QApplication* app = new QApplication(argc, argv);
    Drawer* drawer = new Drawer;
    return app->exec();
}
有什么建议吗?还是我把它作为错误报告发送

更新 针对peppe的评论:

1) 错误记录者怎么说

我能从错误记录者那里得到的唯一东西是

QWindowsGLContext::getProcAddress: Unable to resolve 'glGetPointerv'
这是在我初始化它时打印出来的(不是作为调试事件触发,而是只打印到控制台)。即使
mContext->hasExtension(QByteArrayLiteral(“GL\u KHR\u debug”))
返回true,并且我正在第一帧的draw()函数中初始化它,也会发生这种情况

2) 即使QoglShader编译成功,您是否可以打印其编译日志

我无法在任何时候成功编译QOpenGLShader或QGLShader,因此无法测试这一点。但是,当使用普通GL函数成功编译时,日志将返回空白

3) 您从上下文中获得了哪个GL版本?(请使用QSurfaceFormat进行检查)

我试过3.0、3.2、4.2版本,都有相同的结果

4) 在创建上下文和窗口之前,请在上下文和窗口上设置相同的QSurfaceFormat 5) 记住创建()窗口

我现在已经实现了这两个,结果是一样的

我刚刚在第三台电脑上测试过,没有问题。顺便说一句,正是这台特殊的电脑,恰巧是一台在训练营中运行Windows的Mac Pro。它在运行最新ATI驱动程序的任何其他环境中都绝对没有问题,但我只能得出结论,ATI驱动程序、这台计算机的图形芯片和QOpenGLShaderProgram之间的某个地方存在缺陷


我想我不太可能找到解决办法,所以放弃吧。谢谢你的所有意见

gl绑定和类名从4.8更改为5.2,我认为如果您将
QGLShaderProgram
更改为
QOpenGLShaderProgram
,它应该可以正常工作。我刚刚尝试切换到QOpenGLShaderProgram,但遗憾的是错误是相同的,只是现在它还打印出着色器的源代码,包括一些额外的部分:
#version 110\n#define lowp\n#define mediump\n#define highp\n void main(){gl\u Position=gl\u Vertex;}
。看来这些额外的定义可能是问题的根源。有没有关于如何消除它们的想法?1)QOpenGLDebugLogger怎么说?2) 即使QoglShader编译成功,您是否可以打印其编译日志?3) 您从上下文中获得了哪个GL版本?(请使用QSurfaceFormat进行检查)。4) 在创建上下文和窗口之前,请在上下文和窗口上设置相同的QSurfaceFormat 5)记住创建()窗口谢谢peppe,我已经在上面的更新中回答了您的问题。我相信是这样,但不幸的是,我没有关于它的任何详细信息,因为我不再从事该项目。但是,如果有任何东西修复了它,它将是对驱动程序或Qt5的更新。
#include "Test.h"
#include <QGLShaderProgram>
#include <iostream>
#include <ostream>

using namespace std;

Drawer::Drawer()
    : mTimer(new QTimer)
    , mContext(new QOpenGLContext)
    , frame(0)
{
    mContext->create();
    setSurfaceType(OpenGLSurface);
    mTimer->setInterval(40);
    connect(mTimer, SIGNAL(timeout()), this, SLOT(draw()));
    mTimer->start();
    show();
}

const char* vertex = "#version 110 \n void main() { gl_Position = gl_Vertex; }";
const char* fragment = "#version 110 \n void main() { gl_FragColor = vec4(0.0,0.0,0.0,0.0); }";

void Drawer::draw()
{
    mContext->makeCurrent(this);
    if (frame==0) {
        initializeOpenGLFunctions();
    }
    // Compile using QGLShaderProgram. This always fails
    if (frame < 5)
    {
        QGLShaderProgram* prog = new QGLShaderProgram;
        bool f = prog->addShaderFromSourceCode(QGLShader::Fragment, fragment);
        cout << "fragment "<<f<<endl;
        bool v = prog->addShaderFromSourceCode(QGLShader::Vertex, vertex);
        cout << "vertex "<<v<<endl;
        bool link = prog->link();
        cout << "link "<<link<<endl;
    }
    // Manual compile using OpenGL direct. This works except for the first time it
    // follows the above block
    {
        GLuint prog = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(prog, 1, &fragment, 0);
        glCompileShader(prog);
        GLint success = 0;
        glGetShaderiv(prog, GL_COMPILE_STATUS, &success);
        GLint logSize = 0;
        glGetShaderiv(prog, GL_INFO_LOG_LENGTH, &logSize);
        GLchar* log = new char[8192];
        glGetShaderInfoLog(prog, 8192, 0, log);
        cout << "manual compile " << success << endl << log << endl;
        delete[] log;
    }
    glClearColor(1,1,0,1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    mContext->swapBuffers(this);
    frame++;
}
configure -developer-build -opensource -nomake examples -nomake tests -mp -opengl desktop -icu -confirm-license
QWindowsGLContext::getProcAddress: Unable to resolve 'glGetPointerv'