OpenGL - SOIL не загружает изображение в формате JPG или PNG - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь сделать загрузчик контекста в 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, и он не будет работать ни с одним из них.

1 Ответ

1 голос
/ 03 апреля 2019

Несмотря на то, что вы, похоже, предполагаете, SOIL_load_OGL_texture почти наверняка не будет проверять каталог исполняемого файла.Относительные пути относятся к текущему рабочему каталогу процесса.Исходя из вашего описания, я предполагаю, что вы используете IDE Visual Studio.По умолчанию Visual Studio будет использовать каталог файла проекта в качестве рабочего каталога при запуске программы.Вы можете изменить этот параметр в свойствах проекта> Отладка> Рабочий каталог.Я бы предложил изменить это на любой каталог, в котором вы планируете запускать готовое приложение.

Если вы хотите указать путь к вашей картинке относительно пути исполняемого файла, то я бы предложилвместо этого используйте абсолютный путь.К сожалению, в стандарте C ++ нет способа надежно найти путь к вашему исполняемому файлу.В Windows вы можете использовать GetModuleFileName().Проверьте этот вопрос для получения дополнительной информации по этой теме.Получив абсолютный путь к исполняемому файлу, извлеките путь к каталогу и добавьте свое имя файла.Если вы можете использовать C ++ 17, std::filesystem может помочь вам в работе с путями ...

...