Серьезные проблемы с рендерингом в OpenGL 4.1 и Qt 5
Я видел многообещающие ссылки на возможность запуска Qt5 на современном OpenGL. Я использую следующий код для установки моего QQuickView на OpenGL 4.1 Core (последняя версия поддерживается на OSX 10.9 с моим MacBook).
QSurfaceFormat sf = g_mainView->format();
sf.setProfile(QSurfaceFormat::CoreProfile);
sf.setVersion(4, 1);
g_mainView->setFormat(sf);
Главные проблемы. Во-первых, приложение полностью падает при попытке визуализации текста. Если в моем QML есть только изображения, прямоугольники и т. Д., Я получаю массу ошибок фрагмента шейдера.
QOpenGLShader::compile(Fragment): ERROR: 0:1: '' : #version required and missing.
ERROR: 0:5: 'varying' : syntax error syntax error
*** Problematic Fragment shader source code ***
#define lowp
#define mediump
#define highp
varying highp vec2 qt_TexCoord0;
uniform highp float qt_Opacity;
uniform lowp sampler2D source;
uniform lowp sampler2D maskSource;
void main(void) {
gl_FragColor = texture2D(source, qt_TexCoord0.st) * (texture2D(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
}
***
QQuickCustomMaterialShader: Shader compilation failed:
"ERROR: 0:1: '' : #version required and missing.
ERROR: 0:5: 'varying' : syntax error syntax error
"
Qt5.3 еще не готов для современного OpenGL? Или я просто неправильно его настраиваю? Я хочу встроить свои собственные графические окна OpenGL, используя OpenGL 4, поэтому я предполагаю, что мне нужно, чтобы это приложение также работало под GL 4. Есть ли другой способ?
2 ответа
Я добавил несколько комментариев к вашему сообщению об ошибке и проголосовал за него. Это действительно ошибка Qt, как указано здесь: https://www.opengl.org/wiki/Core_Language_%28GLSL%29 первая директива препроцессора должна быть #version, но Qt добавляет определения для lowp, mediump и highp on свое нарушение этого требования. Драйверы Nvidia позволяют вам сойти с рук, а Intel - нет (я не знаю об ATI), поэтому, возможно, ответственные разработчики не тестировали на достаточно разных конфигурациях оборудования.
Так как нет простого обходного пути, вы можете изменить код Qt так, чтобы он не добавлял эти определения (что является кошмаром распространения), или не использовать класс QOpenGLShader, что означает собственное хранение необработанных объектов OpenGL.
Я не согласен с тем, что это ошибка в Qt. Как указано в вставленной вами ссылке: "Если директива #version не отображается сверху, то она принимает значение 1.10, что почти наверняка не то, что вам нужно".
Это то, что хочет Qt, и это то, что должен предоставлять / разрешать контекст OpenGL4. Это ошибка в драйверах Intel: если вам нужен контекст>2.0, неявный откат к версии GLSL1.10 не работает с драйверами Intel