Olen juuri alkanut harjoitella OpenGL:n käyttöä, enkä vielä nähtävästi osaa oikein käyttää tekstuureja. Saan tekstuurin piirrettyä kyllä, mutta en oikein: Kaikki ohjelman grafiikkojen värit vääristyvät ja tekstuuri näkyy (muuten oikein, mutta värit vääristyy), jos glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-rivi on koodissa. Ongelma pysyy samana, jos GL_LINEAR
tilalle laitetaan GL_NEAREST
. Jos taas rivi poistetaan koodista tai käytetään GL_LINEAR_MIPMAP_LINEAR
, kaikki muut grafiikat paitsi itse tekstuuri näkyy oikein, jolloin itse tekstuuri on vain punainen neliö. Eli jos mipmapping on päällä niin värit vääristyvät(?). Käytän tämän koodivinkin funktiota muuntaessani SDL_Surfacen tekstuuriksi seuraavasti:
Ohjelman kanssa samassa kansiossa on tiedosto kuva.bmp.
Koodia ennen pääsilmukkaa:
glEnable(GL_TEXTURE_2D); SDL_Surface *kuva = SDL_LoadBMP("kuva.bmp"); GLuint tekstuuri; if (!kuva) return 1; // suljetaan ohjelma, jos kuvan lataaminen ei onnistu // Ensin varataan ja valitaan GL-tekstuuri normaalisti. glGenTextures(1, &tekstuuri); glBindTexture(GL_TEXTURE_2D, tekstuuri); if (MySDL_glTexImage2D(kuva) != 0) return 1; // suljetaan ohjelma, jos tekstuuriksi muuntaminen ei onnistu glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // tämä on siis kyseinen rivi. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Pääsilmukassa tekstuurin piirto:
glBegin(GL_QUADS); glTexCoord2f( 0, 0.5); glVertex3f(-1, -1, 0); glTexCoord2f( 0.5, 0.5); glVertex3f( 1, -1, 0); glTexCoord2f( 0.5, 1); glVertex3f( 1, 1, 0); glTexCoord2f( 0, 1); glVertex3f(-1, 1, 0); glEnd();
Piirrän kuva.bmp:stä siis vain vasemman yläneljänneksen.
En tiedä, löytyykö vika oikeasti nuosta kohdista koodia vai jostain muualta.
Millä tavalla värit vääristyvät? Voitko laittaa jonnekin näytille oikean tekstuurin ja piirron tuloksen? Ja viimeiseksi: et kai vain itse aseta sitä väriä esimerkiksi glColor-funktioilla?
Huomasinkin tuota kuva.bmp:tä tutkiessani, että se piirtyykin aivan oikein, myös värit(muistin, että kuva olisi mustavalkoinen). Muiden grafiikkojen värit kyllä vääristyvät.
Tässä kuva.bmp:
http://resiina.arkku.net/b/kuva.bmp
Tässä ylempänä vääristyneet värit ja alempana oikeat värit:
http://resiina.arkku.net/b/varit.jpg
Koodissa on vain muiden polygonien yhteydessä käytetty glColor3f:ää. Ei tekstuuria piirrettäessä.
Edit. Muokkasin kuva.bmp:n mustavalkoiseksi. Nyt muut värit eivät vääristy, mutta tekstuuri pysyy vielä punaisena. Huomasin myös, että vääristymä tapahtuu muillakin väreillä. Vääristymän väri riippuu tekstuurin väristä. Jos pidän tuon hymynaamaneljänneksen kuvassa mustavalkoisena ja värjään muut neljännekset, vääristymää ei tapahdu.
Resiina kirjoitti:
Koodissa on vain muiden polygonien yhteydessä käytetty glColor3f:ää. Ei tekstuuria piirrettäessä.
Eli ennen tekstuurin piirtoa on "nollattu" värit, esim. glColor3f(1.0f, 1.0f, 1.0f)?
Minusta tuntuu nyt, että jätät teksturoinnin ja värityksen päälle, jolloin lopputulos on, mitä sattuu. Jos on tarkoitus piirtää jotain ilman tekstuuria, teksturointi pitää ennen glBegin-riviä ottaa pois (glDisable(GL_TEXTURE_2D)), tai muuten OpenGL käyttää "tekstuurina" vain viimeksi valituksi jäänyttä pikseliä tekstuurista. Vastaavasti ennen tekstuurin käyttöä pitää asettaa väriksi valkoinen (glColor3f(1,1,1)), koska OpenGL moduloi tekstuurin valitulla värillä eli tavallaan suodattaa muut värit pois.
Noniin, nyt toimii. Laitoin glColor3f(1.0f, 1.0f, 1.0f); ennen tekstuurin piirtoa ja tekstuuri piirtyy oikein. Kiitoksia avusta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.