Gå til innhold

Forhindre flere kopier av samme OGL textur.


Anbefalte innlegg

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
Videoannonse
Annonse
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 av Froya
Lenke til kommentar

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 av Quinzo
Lenke til kommentar
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

:blush:

 

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 :no: , 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 av Quinzo
Lenke til kommentar
:blush:

 

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  :no: , 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 av Giddion
Lenke til kommentar

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
  • 3 uker senere...
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
  • 4 uker senere...

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 av _vamecum
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...