Quinzo Skrevet 26. mars 2007 Del Skrevet 26. mars 2007 Heisann, Jeg har holdt på med "spillprogrammering" en liten stund, men jeg har ikke helt skjønt hvordan man kan forhindre at det finnes flere kopier av samme OGL textur. Dvs. slik at flere objekter med samme bilde/tekstur bruker samme OGL texture objekt , hvis dere skjønner? Jeg har eksperimentert litt, men jeg får bare hvite firkanter uten noe tekstur på(og ja, jeg har GL_ENABLE(GL_TEXTURE_2D) på ) Tusen tusen tusen takk for all hjelp jeg måtte få! Lenke til kommentar
Froya Skrevet 26. mars 2007 Del Skrevet 26. mars 2007 (endret) Heisann, Jeg har holdt på med "spillprogrammering" en liten stund, men jeg har ikke helt skjønt hvordan man kan forhindre at det finnes flere kopier av samme OGL textur. Dvs. slik at flere objekter med samme bilde/tekstur bruker samme OGL texture objekt , hvis dere skjønner? Jeg har eksperimentert litt, men jeg får bare hvite firkanter uten noe tekstur på(og ja, jeg har GL_ENABLE(GL_TEXTURE_2D) på ) Tusen tusen tusen takk for all hjelp jeg måtte få! 8242416[/snapback] Muli jeg misforstår spørsmålet.. Men har du med glBindTexture(GL_TEXTURE_2D, texture[1]); DrawStorerikanter(); glBindTexture(GL_TEXTURE_2D, texture[2]); DrawSmåFirkanter(); Du må binde textures forann hvert segment av koden der du ønsker en gitt type texture på objektene. Men som sagt.. håper jeg ikke misforstod deg.. Edit: Legger til hvordan jeg styrer texture loading i noe jeg holder på å skriver på akkurat nå. Dette har jeg på toppen av InitGl funksjonen.. int InitGL(GLvoid) // All Setup For OpenGL Goes Here { if (!LoadGLTextures()) // Jump To Texture Loading Routine { return FALSE; // If Texture Didn't Load Return FALSE } //.. int LoadGLTextures() // Load Bitmap And Convert To A Texture { int Status = TRUE; // Assume everything is OK Status = Status && CreateTexture("Data/spaceship.bmp", 0) ; Status = Status && CreateTexture("Data/Background.bmp", 1) ; Status = Status && CreateTexture("Data/Particle.bmp", 2); Status = Status && CreateTexture("Data/Bullet.bmp", 3); return Status; } int CreateTexture(LPSTR filename, int textureID) { int Status=FALSE; // Status Indicator AUX_RGBImageRec *textureImage; // Create Storage Space For The Textures //memset(textureImage,0,sizeof(void *)); // Set The Pointer To NULL if (textureImage=LoadBMP(filename)) // Load Particle Texture { Status=TRUE; // Set The Status To TRUE glGenTextures(1, &texture[textureID]); // Create One Texture glBindTexture(GL_TEXTURE_2D, texture[textureID]); // Choose texture state gluBuild2DMipmaps(GL_TEXTURE_2D, 3, textureImage->sizeX, textureImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, textureImage->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if (textureImage) // If Texture Exists { if (textureImage->data) // If Texture Image Exists { free(textureImage->data); // Free The Texture Image Memory } free(textureImage); // Free The Image Structure } return Status; // Return The Status } og for å velge en texture til et valgt object, bruker jeg glBindTexture på denne måten: glBindTexture(GL_TEXTURE_2D,texture[0]);//Select texture for the item. if(item.getActive()) { item.setYpos(item.getYpos() - 0.5f);//Move the 1up item down on the y-axis. item.RenderItem(); //Draw the item. } pship.collisionItem(item);//Check if the player picks up the current item. når jeg binder texture med ID 0, så vil alle render funksjoner der jeg bruker textures ta i bruk den texturen som jeg nylig "bindet". Inntil jeg binder en ny texture.. Uhm.. vet ikke om dette hjalp deg noe.. Får håpe det:) Endret 26. mars 2007 av Froya Lenke til kommentar
Quinzo Skrevet 26. mars 2007 Forfatter Del Skrevet 26. mars 2007 (endret) Nei, det er mer som at jeg har en texture i hvert game object og jeg gjør slik: setup: if(this.texturepath == noen i texure vektoren) set this.texture til det texturet i texturevektor som hadde lik path else legg til en ny texture objekt i texturevektor med this.texturepath som path så generere. så: glBindTexture(GL_TEXTURE_2D, this->texture); Render(); Jeg håper du forstår. EDIT: Takk for koden, men jeg bruker SDL og i tillegg har jeg koden mer "dynamisk" altså slik at jeg kan ha så mange objekter jeg vil uten at jeg trenger å hardkode det. Men tusen takk, jeg skal se om jeg kan bruke det Endret 26. mars 2007 av Quinzo Lenke til kommentar
Giddion Skrevet 26. mars 2007 Del Skrevet 26. mars 2007 Nei, det er mer som at jeg har en texture i hvert game object og jeg gjør slik: setup: if(this.texturepath == noen i texure vektoren) set this.texture til det texturet i texturevektor som hadde lik path else legg til en ny texture objekt i texturevektor med this.texturepath som path så generere. så: glBindTexture(GL_TEXTURE_2D, this->texture); Render(); Jeg håper du forstår. 8242956[/snapback] Jeg forstår overhode ikke. Har du problemer med rendringen av teksturer? Har du problemer med at du laster samme teksturen flere ganger? Hvorfor legger du teksturene i en vector? Hvis du har problemer med rendringen: Vet du at texturene blir korrekt lastet? Har du testet med glerror? Ikke noe vondt ment, men jeg skjønner bare ikke hva du spør om. Lenke til kommentar
Quinzo Skrevet 26. mars 2007 Forfatter Del Skrevet 26. mars 2007 (endret) Ok. Jeg ser nå at det var veldig dårlig forklart. Her er en bedre forklaring: Har du problemer med rendringen av teksturer? Ja. Har du problemer med at du laster samme teksturen flere ganger? Hvis ikke OGL hindrer det å skje automatisk, har jeg nok det. Vet du at texturene blir korrekt lastet? Nei, men jeg vet ikke hvordan jeg får testet det, siden jeg ikke har laget en annen lastekode i spillet. Har du testet med glerror? Nei, skal søke på det. Hvorfor legger du teksturene i en vector? Jeg bruker to klasser i dette tilfellet. CObject og CRenderer. I CRenderer har jeg en vektor av GLuint som skal holde alle teksturobjektene. I tillegg har jeg en annen vektor som er av std::string. Denne holder filnavnet til teksturene i den andre vektoren, dvs textNames[0] holder navnet til textures[0] osv.(Jeg har prøvd std::map, men den pep om noe med "read/write" restrictions, så jeg droppet det) I CObject har jeg en gluint* som kalles texture og en std::string som er filnavnet på teksturen. Konstruktøren til CObject er slik: gå gjennom CRenderer::textNames og se om det er en match med filnavnet i CObject. { Hvis det er det, setter jeg texture(GLuint* en ) til CRenderer::texture[posisjonen hvor jeg fant en match mellom filnavnene] Hvis det ikke er en match, legger jeg til filnavnet i CRenderer::textNames og legger til en GLuint i CRenderer::textures. } Her genererer jeg teksturene(glGenTextures(vektorsize, &CRenderer::textures). Når jeg da skal rendre, kaller jeg render() fra CObject som gjør: glBindTexture(GL_TEXTURE_2D, this->texture); //Rendering her Nei, dette ble veldig komplisert , jeg håper inderlig dere skjønner. Hvis ikke kan jeg bare gjøre det mindre komplisert og se om det funker, jeg har en rar tendens til å gjøre ting verre en det de er Endret 26. mars 2007 av Quinzo Lenke til kommentar
Giddion Skrevet 27. mars 2007 Del Skrevet 27. mars 2007 (endret) Ok. Jeg ser nå at det var veldig dårlig forklart. Her er en bedre forklaring: 8243308[/snapback] mye bedre nå Har du problemer med at du laster samme teksturen flere ganger?Hvis ikke OGL hindrer det å skje automatisk, har jeg nok det. 8243308[/snapback] Det er ikke et problem som vil påvirke rendringen, men du vil jo ende opp med å bruke mer minne en det du trenger, men det er alt som vil skje. Vet du at texturene blir korrekt lastet?Nei, men jeg vet ikke hvordan jeg får testet det, siden jeg ikke har laget en annen lastekode i spillet. 8243308[/snapback] Forstår jeg det riktig at du ikke laster inn teksturer? Hvis du ikke laster inn teksturer vil alle teksturene du bruker bli helt hvite. Har du testet med glerror?Nei, skal søke på det. 8243308[/snapback] glerror er en funksjon i openGL hvis du ikke har brukt den så er det et must for bruk til debugging. Hvorfor legger du teksturene i en vector? Jeg bruker to klasser i dette tilfellet. CObject og CRenderer. I CRenderer har jeg en vektor av GLuint som skal holde alle teksturobjektene. I tillegg har jeg en annen vektor som er av std::string. Denne holder filnavnet til teksturene i den andre vektoren, dvs textNames[0] holder navnet til textures[0] osv.(Jeg har prøvd std::map, men den pep om noe med "read/write" restrictions, så jeg droppet det) I CObject har jeg en gluint* som kalles texture og en std::string som er filnavnet på teksturen. Konstruktøren til CObject er slik: gå gjennom CRenderer::textNames og se om det er en match med filnavnet i CObject. { Hvis det er det, setter jeg texture(GLuint* en ) til CRenderer::texture[posisjonen hvor jeg fant en match mellom filnavnene] Hvis det ikke er en match, legger jeg til filnavnet i CRenderer::textNames og legger til en GLuint i CRenderer::textures. } Her genererer jeg teksturene(glGenTextures(vektorsize, &CRenderer::textures). Når jeg da skal rendre, kaller jeg render() fra CObject som gjør: glBindTexture(GL_TEXTURE_2D, this->texture); //Rendering her Nei, dette ble veldig komplisert , jeg håper inderlig dere skjønner. Hvis ikke kan jeg bare gjøre det mindre komplisert og se om det funker, jeg har en rar tendens til å gjøre ting verre en det de er 8243308[/snapback] Slik som jeg ser koden din så vil den hindre lasting av samme teksture flere ganger, den ligner forsåvidt veldig på min kode og den funker. EDIT: tagene var rare så jeg fikset på det Endret 27. mars 2007 av Giddion Lenke til kommentar
Quinzo Skrevet 27. mars 2007 Forfatter Del Skrevet 27. mars 2007 Ah, beklager. Jeg trodde du mente selve lastekoden Ja, jeg sjekker om SDL_Surface(eller det minnestedet som holder bildet) er NULL. Hvis det er det logger jeg det i en fil, ellers så bruker jeg bildet som tekstur. Tusen takk for hjelpen, jeg ville bare vite om jeg gjorde ting helt galt Lenke til kommentar
hishadow Skrevet 14. april 2007 Del Skrevet 14. april 2007 Hvorfor legger du teksturene i en vector? Jeg bruker to klasser i dette tilfellet. CObject og CRenderer. I CRenderer har jeg en vektor av GLuint som skal holde alle teksturobjektene. I tillegg har jeg en annen vektor som er av std::string. Denne holder filnavnet til teksturene i den andre vektoren, dvs textNames[0] holder navnet til textures[0] osv.(Jeg har prøvd std::map, men den pep om noe med "read/write" restrictions, så jeg droppet det) GLuint-en er bare en referanse til teksturobjektet i OpenGL, så denne verdien kan du kopiere rundt og bruke uten problemer. Det eneste du må passe på når du laster inn teksturer er å sjekke om teksturfilnavnet allerede finnes i textNames, ellers vil du få flere kopiere av samme tekstur i OpenGL. Lenke til kommentar
_vamecum Skrevet 7. mai 2007 Del Skrevet 7. mai 2007 (endret) jeg har brukt noe slikt før. funker greit nok. std::map<std::string,GLuint> textures; GLuint getTexture(const std::string& file) { if(textures.find(file)==textures.end()) { textures[file] = loadTexture(file); } return textures[file]; } Endret 7. mai 2007 av _vamecum Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå