Ошибка при загрузке изображения с помощью stb - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь загрузить следующее изображение:

enter image description here

В качестве текстуры для Стэнфордского Дракона. Результат, однако, выглядит следующим образом: enter image description here

Я читал, что у других людей были проблемы с этим из-за неправильной привязки текстур или использования неправильного количества компонентов при загрузке текстуры. Я думаю, что у меня нет ни одной из этих проблем, так как я проверяю формат изображения и привязываю текстуру. Мне удалось заставить другие изображения загружаться правильно, так что, похоже, есть проблема, специфичная для этого изображения (я не говорю, что изображение повреждено, скорее, что что-то в этом изображении немного отличается от других изображений, которые я пробовал) .

Код, который я использую для инициализации текстуры, выглядит следующим образом:

//Main constructor
Texture::Texture(string file_path, GLuint t_target)
{
    //Change the coordinate system of the image
    stbi_set_flip_vertically_on_load(true);
    int numComponents;
    //Load the pixel data of the image
    void *data = stbi_load(file_path.c_str(), &width, &height, &numComponents, 0);
    if (data == nullptr)//Error check
    {
        cerr << "Error when loading texture from file: " + file_path << endl;

        Log::record_log(
            string(80, '!') +
            "\nError when loading texture from file: " + file_path + "\n" +
            string(80, '!')
        );
        exit(EXIT_FAILURE);
    }
    //Create the texture OpenGL object
    target = t_target;
    glGenTextures(1, &textureID);
    glBindTexture(target, textureID);
    //Name the texture
    glObjectLabel(GL_TEXTURE, textureID, -1,
        ("\"" + extract_name(file_path) +"\"").c_str());
    //Set the color format
    color_format = numComponents == 3 ? GL_RGB : GL_RGBA;

    glTexImage2D(target, 0, color_format, width, height, 0,
        color_format, GL_UNSIGNED_BYTE, data);
    //Set the texture parameters of the image
    glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    //free the memory
    stbi_image_free(data);
    //Create a debug notification event
    char name[100];
    glGetObjectLabel(GL_TEXTURE, textureID, 100, NULL, name);
    string message = "Succesfully created texture: " + string(name) +
        ". Bound to target: " + textureTargetEnumToString(target);
    glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, 0,
        GL_DEBUG_SEVERITY_NOTIFICATION, message.size(), message.c_str());
}

1 Ответ

0 голосов
/ 02 мая 2018

в формате JPEG, а? Наверное, тогда нет альфа-канала. А ширина 894 пикселя не вполне , делится поровну на 4.

Перепроверьте, попадаете ли вы в дело numComponents == 3 и, если да, убедитесь, что для GL_UNPACK_ALIGNMENT установлено значение 1 (по умолчанию 4) с glPixelStorei() перед вашим glTexImage2D() вызовом.

...