我有一个使用QT的GLShaderProgram类的工作GLSL片段着色器。它在第一次编译着色器时工作得很好。
当我尝试使用下面的代码重新编译着色器(在运行时)时,没有编译错误(“Shader重新编译”),但着色器显示不会改变。发生了什么事?
delete SHADER; // free up the existing shader
SHADER = new QGLShaderProgram(context);
if (SHADER->addShaderFromSourceFile(QGLShader::Fragment, ":/shaders/test_shader1.frag")) {
if (!SHADER->link()) {
qDebug() << SHADER->log().trimmed();
delete SHADER;
}
qDebug() << "Shader recompiled";
} else {
qDebug() << SHADER->log().trimmed();
delete SHADER;
}
答案 0 :(得分:3)
找出问题所在。我正在使用QT资源(http://doc.qt.io/qt-5/resources.html)通过相对路径加载着色器文件。据我所知,QT在第一次访问资源时会缓存资源的内容,因此更改资源的内容不会更新程序。
通过引用文件的绝对路径,重新加载着色器现在可以正常工作。
addShaderFromSourceFile(QGLShader::Fragment, "/home/eric/test_shader1.frag")
干杯!