Поврежденные текстуры с OpenGL 4.1 на Mac OS - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь рисовать текстуры с помощью языка шейдеров OpenGL 4.1. На Windows он работает абсолютно нормально, так что я уверен, что нет проблем с шейдером или координатами. На Mac, однако, текстуры повреждены, как на картинке:


enter image description here


Если вы заметите - есть две небольшие текстуры, выглядит нормально. Уникальным в них является то, что один имеет размер 16, а второй имеет ширину 32 пикселя (степень 2). Поэтому это должно быть что-то в конфигурации или хранилище пикселей. Не может быть, чтобы текстуры, не являющиеся степенью 2, не поддерживаются, поскольку они были в устаревшем контексте openGL (не GLSL). Вот пример генерации моей текстуры:

    unsigned char* pixels = convertedImage->m_pixelbufs.at(0);
    GLuint imageDepth = convertedImage->GetBitsPerPixel() == 24 ? GL_RGB : GL_RGBA;

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    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_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, convertedImage->GetWidth(), convertedImage->GetHeight(), 0, imageDepth, GL_UNSIGNED_BYTE, pixels);

    glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
    glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
    glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
    glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glBindTexture(GL_TEXTURE_2D, 0);

Я пытался играть с другими параметрами glPixelStorei, но текстуры всегда были повреждены. Любая подсказка?

1 Ответ

0 голосов
/ 28 мая 2019

Проблема была в другом месте.Был старый фрагмент кода, проверяющий расширение GL_ARB_texture_non_power_of_two перед тем, как фактически извлечь файл PNG в память и действовать соответствующим образом.На окнах, несмотря на то, что он был перемещен в основной ответ, было - TRUE , поэтому поведение было таким, как ожидалось.На Mac, поскольку он перешел на Ce, ответ был - FALSE , поэтому поведение было неправильным.

...