Russian Qt Forum

Qt => OpenGL => Тема начата: Crazy Sage от Январь 18, 2017, 10:15



Название: Qt не распознаёт версию шейдера [Qt5.7, C++]
Отправлено: Crazy Sage от Январь 18, 2017, 10:15
Пытаюсь запустить шейдер в консольном Qt-приложении, получаю следующую ошибку

Код:
QOpenGLShader::compile(Compute): 0(1) : error C0201: unsupported version 44
0(1) : error C0206: invalid token "<invalid atom 284073152>" in version line

Шейдер гарантированно рабочий, в программе на OpenFrameworks он работает безо всяких проблем (но по требованию заказчика надо теперь работать на Qt), шейдер начинается со строки

Код:
#version 440

Контекст OpenGL инициализируется в main.cpp следующим образом

Код:
QSurfaceFormat surfaceFormat;
surfaceFormat.setMajorVersion(4);
surfaceFormat.setMinorVersion(4);
surfaceFormat.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(surfaceFormat);

QOpenGLContext openGLContext;
openGLContext.create();
if(!openGLContext.isValid())
{
    qDebug()<<"Failed to create openGL context";
    return 0;
}
QOffscreenSurface surface;
surface.create();
if(!surface.isValid())
{
    qDebug()<<"Failed to create surface";
}

код подключения шейдера выглядит следующим образом

Код:
QOpenGLShaderProgram compute;
compute.addShaderFromSourceFile(QOpenGLShader::Compute,":/shaders/cull.glsl");
compute.link();

Кто-нибудь знает, в чём может быть проблема?


Название: Re: Qt не распознаёт версию шейдера [Qt5.7, C++]
Отправлено: Crazy Sage от Январь 18, 2017, 10:40
Разобрался, может кому ещё пригодится.
Файл шейдера был сохранён в Visual Studio, соответственно в win-кодировке. Программа на openFrameworks также была собрана под MSVC, поэтому в ней этот шейдер спокойно обрабатывался, Qt же (по крайней мере версия под MinGW) оказалось неспособно прожевать виндоузовские окончания строк. Принудительное пересохранение файла шейдера в UTF-8 решило проблему.


Название: Re: Qt не распознаёт версию шейдера [Qt5.7, C++]
Отправлено: Авварон от Январь 18, 2017, 12:07
Разобрался, может кому ещё пригодится.
Файл шейдера был сохранён в Visual Studio, соответственно в win-кодировке. Программа на openFrameworks также была собрана под MSVC, поэтому в ней этот шейдер спокойно обрабатывался, Qt же (по крайней мере версия под MinGW) оказалось неспособно прожевать виндоузовские окончания строк. Принудительное пересохранение файла шейдера в UTF-8 решило проблему.

Код:
bool QOpenGLShader::compileSourceFile(const QString& fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly)) {
        qWarning() << "QOpenGLShader: Unable to open file" << fileName;
        return false;
    }

    QByteArray contents = file.readAll();
    return compileSourceCode(contents.constData());
}

Заведите баг что он должен открывать с флагом QFile::Text