Текстура OpenGL содержит неверные данные - что происходит?

Я пытаюсь загрузить изображение в текстуру OpenGL.

Я создал окно и GL 4.4 Core Forward-совместимый контекст:

контекст

Вот код, который я использую для загрузки изображения и создания текстуры:

load :: IO ()
load = do
    image <- JP.readImage "image.png"
    case image of
        (Left err) -> do print err
                         exitWith (ExitFailure 1)
        (Right imgData) -> do 
            a <- malloc
            glGenTextures 1 a
            texId <- peek a
            free a
            loadImgIntoTexture texId imgData

loadImgIntoTexture texId (JP.ImageRGBA8 (JP.Image width height dat)) = do
    glBindTexture GL_TEXTURE_2D texId
    unsafeWith dat $ glTexImage2D GL_TEXTURE_2D 0 GL_RGBA (fromIntegral width) (fromIntegral height) 0 GL_RGBA GL_UNSIGNED_BYTE . castPtr
    --p <- mallocBytes $ (fromIntegral width) * (fromIntegral height) * 4
    --glTexImage2D GL_TEXTURE_2D 0 GL_RGBA (fromIntegral width) (fromIntegral height) 0 GL_RGBA GL_UNSIGNED_BYTE (castPtr p)
    print "everything ok"

Закомментированная строка - это еще одна попытка внести что-либо значимое в эту текстуру.

Вот что сообщает gDebugger для информации о текстуре:

информация о текстуре

И вот что это показывает для содержимого текстуры:

содержание текстуры

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

В этом примере я не рендерил текстуру, а использую необработанное связывание, сгенерированное gl пакет. У меня было точно такое же поведение (с тем же оттенком чирка) при использовании OpenGL пакет. Неудивительно, что он отображается как плоский прямоугольник на экране.

Я пробовал с разными изображениями, размером 128х128 и NPOT (100х100, как на скриншотах).

Что может быть причиной такого поведения?

Полный источник.

2 ответа

Решение

Скорее всего, это ошибка в gDEBugger. После некоторых манипуляций и фактического рисования текстуры я убедился, что она действительно содержит правильные данные.

Сочетание высокофункционального Haskell с OpenGL, создателем нестабильного состояния, в лучшем случае не принесет пользы, и поэтому я признаюсь, что с этим точным сценарием мне не по зубам.

Тем не менее, хорошо известно, что текстуры OpenGL являются неполными без фильтра минимизации и фильтра увеличения, соответствующих данным (см. Здесь). Я не видел такого в коде, поэтому ваша текстура неполная. В C вы бы добавили что-то вроде:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

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

Другие вопросы по тегам