【问题标题】:OpenGL - SOIL won't load JPG or PNG imageOpenGL - SOIL 不会加载 JPG 或 PNG 图像
【发布时间】:2019-08-25 00:25:53
【问题描述】:

我正在尝试在 OpenGL 中创建上下文加载器,但无法让 SOIL 加载图像。

代码如下:

Texture2D TextureLoader::loadSprite(const char* path)
{
    int width, height;
    GLuint texture = SOIL_load_OGL_texture(path, SOIL_LOAD_RGBA, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);

    if (texture == 0)
    {
        Texture2D failedTexture;
        return failedTexture;
    }

    glBindTexture(GL_TEXTURE_2D, texture);

    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glBindTexture(GL_TEXTURE_2D, 0);

    Texture2D texture2d(texture, width, height);
    return texture2d;
}

它总是在纹理 == 0 检查时失败。映像文件与构建项目时生成的可执行文件位于同一目录中。 PNG和JPG我都试过了,都不能用。

【问题讨论】:

  • SOIL_load_OGL_texture的文档是否指定它将搜索可执行文件的目录?
  • 我不知道,我以为是这样的,因为这样说得通,而且网上的教程似乎也暗示了这一点。

标签: c++ opengl glfw soil


【解决方案1】:

尽管您似乎假设了什么,SOIL_load_OGL_texture 几乎肯定不会检查可执行文件的目录。相对路径相对于进程的current working directory。根据您的描述,我假设您使用的是 Visual Studio IDE。默认情况下,Visual Studio 在运行程序时会使用项目文件所在的目录作为工作目录。您可以在项目属性 > 调试 > 工作目录中更改该设置。我建议将其更改为您计划在其中运行完成的应用程序的任何目录。

如果您确实想指定相对于可执行文件路径的图片路径,那么我建议您改用绝对路径。不幸的是,没有办法在标准 C++ 中可靠地找到可执行文件的路径。在 Windows 上,您可以使用 GetModuleFileName()。查看this question 了解有关此主题的更多信息。获得可执行文件的绝对路径后,提取目录的路径并附加文件名。如果您可以使用 C++17,std::filesystem 可以帮助您处理路径……

【讨论】:

  • 有没有办法加载相对于可执行文件位置的图像?我怀疑我是否会为我的可执行文件设置一个位置。
  • @liaquore 你在用 C++17 吗?
  • 没有。我使用的是 C++11/14,VS2017 的默认设置。
  • 我通过使用 $(OutputPath) 作为工作目录使它在任何地方都可以工作。
猜你喜欢
  • 2023-03-15
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多