A demó motoromat, ami technikailag egy API, új tulajdonsággal vérteztem fel. Immár képes JPEG fájlokat is használni textúrának. A libJPEGTurbót használtam, mert elég egyszerűnek tűnt a használata, és az Ubuntunak része a könyvtár.
Első használat alkalmával meglepődtem, hogy a kép fejjel lefelé jelent meg, de ezzel nem törődtem sokat. Képet forgatni a világon a legegyszerűbb. Csupán örültem, hogy a kód működik. El is kezdtem készíteni egy demót Experience-re. Szépen haladtam, amikor az egyik textúra betöltésénél core dump-olt a program.
Rögtön észrevettem, mi a baj. Szürke árnyalatos volt a kép, miközben a kód RGB-t várt. A homlokom akkor szaladt csak igazán ráncba, amikor kiderült, hogy a kép RGB verziója is elszáll. Ráadásul a hiába kerestem a hibát, a backtrace szerint a hiba a videó driverben egyik moduljára mutatott, amihez már nem értem gdb-vel. Az én kódomban a glTexImage2D volt az utolsó utasítás.
Nem értettem, hogy két kép közül, amelyek csak a dimenzióban térnek el, az egyik miért működik, miközben a másik lefagy. Elkezdtem különböző méretű textúrákat gyártani, de azok is fagytak. Átkonvertáltam PNG-be, akkor működött.
Ráadásul volt egy nagyon furcsa jelenség is. A "hibás" képpel nem minden esetben szállt el a program. Ritka esetben betöltődött, de el volt csúszva, mintha a kép pixeleit egy kisebb szélességű helyre akarnám betölteni, amitől a következő sor jobbra mozdul. Egy eredetileg függőleges vonal a képen átlóssá vált.
Úgy tűnt, a kép több helyet foglal a memóriában, mint amennyit én allokáltam. Ezzel csak az volt a baj, hogy az összes fellelhető példaprogram szerint mindent megfelelő módon csináltam. Illetve mégsem egészen. Kiderült, van egy paraméter, amivel úgy is be lehet olvasni a JPEG-et, hogy ne legyen fejjel lefelé.
Végül kiderült a turpisság. A kép szélességének 4-el osztható bájtnak kell lennie, különben a glTexImage2D elhasalhat. A PNG-nél nem volt gond, mert ott mindig 4-el osztható volt a szélesség, mert a PNG-ben RGBA-ban tároltam a kép információt. A megoldás csupán annyi, hogy meghívjuk a glPixelStorei-t, és elmagyarázzuk a drivernek, hogy ettől legyen szíves eltekinteni.