Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Ongelma OpenGL-tekstuurin kanssa

Resiina [14.05.2010 02:53:54]

#

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.

Metabolix [14.05.2010 02:59:55]

#

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?

Resiina [14.05.2010 16:46:29]

#

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.

Legu [14.05.2010 17:36:05]

#

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)?

Metabolix [14.05.2010 17:47:50]

#

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.

Resiina [14.05.2010 18:35:23]

#

Noniin, nyt toimii. Laitoin glColor3f(1.0f, 1.0f, 1.0f); ennen tekstuurin piirtoa ja tekstuuri piirtyy oikein. Kiitoksia avusta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta