Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tekstuuri ja glColor3f

kayttaja-3842 [05.11.2010 11:44:59]

#

Tervehdys kaikki,

Minulla olisi ongelmia kahden "modellin" kanssa, joka jotuneepi teksturoinnista. Miten saisin teksturoinnin vaikuttamaan pelkästään aikasemmin luotuun modelliin?

Elikkäs alla näette nopean testi räpellykseni. Eli aluksi luodaan SDL_TTF:än avulla teksti pinta jota sitten käytetään 2D ulotteisen "modellin" teskturoinnista, jotta saadaan teksti ruutuun.

Tämän jälkeen koitan GL_TRIANGLELLA luoda valkoista kolmiuloitteista kolmiota, mutta jostain syystä pelkästään GL_QUADIN piirtämä neliä piirretään ja kolmiota ei edes tule ruutuun. Mikä avuksi?

 int fontSize = 24;

 SDL_Color color = { 255, 0, 255 };
 TTF_Font *font = NULL;
 font = TTF_OpenFont( "verdana.ttf", fontSize );


	SDL_Surface *Message = TTF_RenderText_Blended( font, "Mo", color );
	unsigned Texture = 0;

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);

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

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

	glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, Message->w, Message->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, Message->pixels );


     while( engRun ){
      this->handleEvent();


      rot += ( 0.01 * ker );

      if( rot > 360 ) rot = 0;

      rot2 += ( 0.01 * ker2 );

      if( rot2 > 360 ) rot2 = 0;

        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef( -3.3f, 2.3f, -6.0f );
        //glTranslatef( 0.0f, 0.0f, -6.0f );

    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D, Texture );

	glBegin(GL_QUADS);
		glTexCoord2f(0, 1);
		glVertex2f(0, 0 );

		glTexCoord2f(1, 1);
		glVertex2f( ((float)Message->w / 10) / fontSize, 0 );

		glTexCoord2f(1, 0);
		glVertex2f( ((float)Message->w / 10) / fontSize, ((float)Message->h / 10) / fontSize );

		glTexCoord2f(0, 0);
		glVertex2f(0, ((float)Message->h / 10) / fontSize );
	glEnd();

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

	    glTranslatef( 0.0f, 0.0f, -6.0f );


	    glRotatef(rot,0.0f,1.0f,0.0f);
	    glRotatef(rot2,1.0f,0.0f,0.0f);

    glBegin(GL_TRIANGLES);
		glVertex3f( 0.0f, 1.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f);


		glVertex3f( 0.0f, 1.0f, 0.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f, -1.0f);

		glVertex3f( 0.0f, 1.0f, 0.0f);
		glVertex3f( 1.0f,-1.0f, -1.0f);
		glVertex3f(-1.0f,-1.0f, -1.0f);

		glVertex3f( 0.0f, 1.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);
	glEnd();

	    if( this->getKey()[SDLK_LEFT] ){
	     ker -=0.0001;
	    }

	    if( this->getKey()[SDLK_RIGHT] ){
	     ker +=0.0001;
	    }

	    if( this->getKey()[SDLK_UP] ){
	     ker2 -=0.0001;
	    }

	    if( this->getKey()[SDLK_DOWN] ){
	     ker2 +=0.0001;
	    }
       if( !this->getErrorReport() || this->getKey()[SDLK_ESCAPE] ){
        engRun = false;
       }



      SDL_GL_SwapBuffers();
     }

Metabolix [05.11.2010 12:29:26]

#

Sinun pitää ottaa teksturointi pois (glDisable(GL_TEXTURE_2D)), kun haluat piirtää ilman tekstuuria. Lisäksi koodista näyttäisi puuttuvan kokonaan tuo otsikossa mainitsemasi glColor3f, joka tosin ei olekaan tarpeen, jos haluat vain valkoista etkä muuta tätä missään vaiheessa.

SDL-pinnan säilyttäminen ohjelman ajon aikana on epätehokasta. Kannattaisi vapauttaa Message saman tien ja ottaa vain tarvittavat mitat talteen.

kayttaja-3842 [05.11.2010 13:12:35]

#

Joo tiedän kyllä aikasemmin minulla oli tuo värjätty eri väreillä mutta sitten ajattelin että kuhan nytten alkuu kolmion näkymään "värjäämättömänä" eli valkoisena.

User137 [05.11.2010 13:19:51]

#

Piirrettäessä glMatrixMode() kuuluisi aina olla GL_MODELVIEW.
glMatrixMode(GL_TEXTURE); <- tuo käsky koodisi yhteydessä on jotain hyvin omituista. Se aiheuttaa sen että kaikki matriisikäskyt (glLoadIdentity, glTranslate jne) kohdistuu vain tekstuuri-koordinaatteihin

Onko syvyyspuskuri päällä? On mahdollista että kolmiot piirtyy neliön taakse... Näkyykö ne jos kommentoit neliön piirron?

Ja tosiaan, jos tekstuuri on päällä muttet aseta kolmiolle korrekteja koordinaatteja niin käy siten että edellinen glTexCoord() jää voimaan. Kaikki kolmiot käyttävät sen tietyn pikselin väriä (ellet tee glDisable(GL_TEXTURE_2D)).

kayttaja-3842 [08.11.2010 17:50:21]

#

Joo tuo puoli toimii hyvin nytten, mutta minulla se sellainen ongelma, että jos käytän 765kb textuuriani projektissa, niin ohjelma kaatuu. jos pienennän tekstuurin koon 28kb niin ohjelma toimii. Onko tosiaankin mahdollista, että 700kb tekstuuria ei voi käyttää projektissa.

käytän kuvan pintana SDL_Surface josta haen sitten datan glTexImage2D.

Kiitos.

Metabolix [08.11.2010 17:55:04]

#

Tiedostokoolla ei pitäisi olla merkitystä. Tarkista kaikki muut asiat kuten tekstuurin koko ja väriformaatti. Yleensä näytönohjaimet eivät tue aivan valtavia tekstuureita (esim. yli 4096×4096 pikseliä). Väriformaatin voit korjata koodivinkissäni esitetyllä muunnoksella tai tallentamalla itse tekstuurin oikein.

Vastaus

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

Tietoa sivustosta