【问题标题】:How to open correctly a vertex and fragment shaders on QT Creator [closed]如何在 QT Creator 上正确打开顶点和片段着色器 [关闭]
【发布时间】:2020-01-18 10:53:55
【问题描述】:

所以我试图在 Qt 创建器上打开我的 texture.fs 和 texture.vs,但我仍然遇到错误。为了打开不同的文件,我使用了 Qt Creator 功能,这样做更容易。所以下面的代码就是(这段代码在FragmentGeometry.cpp文件中):

    void FrameGeometry::initShaders()
{
    program = new QOpenGLShaderProgram();

    // Compile vertex shader
    if (!program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/Other\files/texture.vs"))
        std::cout<<"Problem while adding vertex shader"<<std::endl;

    // Compile fragment shader
    if (!program->addShaderFromSourceFile(QOpenGLShader::Fragment, "texture.fs"))
        std::cout<<"Problem while adding fragment shader"<<std::endl;

    // Link shader pipeline
    if (!program->link())
        std::cout<<"Problem while linking program"<<std::endl;
}

错误是:

我也尝试了很多不同的路径,但我仍然不知道为什么它不起作用。我的代码层次结构是:

你能帮我理解为什么它不起作用吗?

【问题讨论】:

  • 相对路径是相对于二进制可执行文件而不是源文件位置。你确定它是正确的?
  • @Maverobot 我正在使用带有 Qt 创建器的 Mac,可执行文件似乎是 Xcode。我将着色器放在我的主文件中,但是我们在 Qt Creator 上的项目中有这个着色器,它认为这个文件是“其他文件”,所以我认为正确的路径是 '":/Other\files/texture.vs" ' 但它仍然无法正常工作,我不知道为什么。我尝试了许多其他方式,例如“/Other files/texture.vs”或“/Other\files/texture.vs”或“../Other\files/texture.vs”。
  • 可以试试绝对路径吗?
  • 我试过了,但文件仍然无法打开@Maverobot
  • 路径中可能缺少一个空格 - ../Other\ files/texture.vs。也尝试命名不带空格的文件夹。

标签: c++ opengl glsl qt-creator


【解决方案1】:

冒号 (:) 建议您的文件应在 .qrc 文件中声明 - 即 Qt Resources file。如果您使用的是 Qt Creator,则需要将行 RESOURCES = your_resources_file.qrc 添加到 test_build_project_new.pro。然后,确保your_resources_file.qrc 声明了您需要的文件。这可能是一个例子:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>shaders/texture.vs</file>
    <file>shaders/texture.fs</file>
</qresource>
</RCC>

然后,从您的代码中,您可以像这样打开文件:

void FrameGeometry::initShaders()
{
    program = new QOpenGLShaderProgram();

    // Compile vertex shader
    if (!program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/texture.vs"))
        std::cout<<"Problem while adding vertex shader"<<std::endl;

    // Compile fragment shader
    if (!program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/texture.fs"))
        std::cout<<"Problem while adding fragment shader"<<std::endl;

    // Link shader pipeline
    if (!program->link())
        std::cout<<"Problem while linking program"<<std::endl;
}

只需确保将着色器放置在正确的目录中即可。在此示例中,这将在 $YOUR_PROJECT_ROOT/shaders/ 中。 另外,请确保您的着色器未在 .pro 文件的DISTFILES 中声明(我看到您的着色器当前位于“其他文件”类别下)。如果您使用 Qt 资源,您也不需要将它们声明为 DISTFILES

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2019-01-24
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多