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(); }
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.
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.
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)).
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.