Gå til innhold

Problem med glReadPixels og bufferstørrelse


Anbefalte innlegg

Skrevet (endret)

OpenGL-funksjonen glReadPixels leser altså ut framebufferet til et array som man kan bruke til andre ting, for eksempel lagre som en bildefil (screenshot). Det er dette jeg forsøker å gjøre. Men jeg finner ingen dokumentasjon som forteller hvor stort buffer en skal allokere.

 

Min logiske sans sier at formelen bør være så enkel som h*b*d, der h er antall pixler i høyden, b er antall pixler i bredden, mens d er antall bytes pr. pixel. Den formelen har jeg faktisk også brukt i et tidligere prosjekt uten å havne i trøbbel.

 

Men av en eller annen grunn får jeg problemer i det prosjektet jeg holder på med nå. Jeg får en "Debug Error! DAMAGE: after Normal block (#594) at 0x02660040." når jeg drar en delete på minnet jeg har allokert. Dette er som kjent en indikasjon på at man har skrevet ut over slutten på det allokerte minnesområdet, noe som i dette tilfellet rett og slett betyr at jeg har allokert for lite minne. Hvis jeg allokerer litt ekstra minne (se nederste avsnitt), forsvinner problemet.

 

Her er koden (på forhånd er følgende verdier satt: x = 0, y = 0, width = 790, height = 586):

   int datasize = width * height * 3;     // 790 * 586 * 3 = 1388820
  // int datasize = 1389990;     // dette fungerer

  unsigned char *pixels = new unsigned char[datasize];
  glReadPixels (x, y, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels);

  /* her skal det etterhvert inn kode for å lagre til fil */
  delete pixels; // her blir det bråk hvis datasize er mindre enn 1389990

1389990 bytes er altså minimum buffer-størrelse som holder til å kjøre glReadPixels på et område på 790x586 pixler med 3 bytes pr. pixel. Det er 1170 bytes mer enn ovennevnte formel indikerer. Er det noe slags header-data som også må tas høyde for? All den tid jeg ikke har konstant høyde og bredde på viewporten min, så må jeg ha en formel som kan gi en korrekt buffer-størrelse. Noen som vet noe jeg ikke vet? :)

Endret av alfred97
Videoannonse
Annonse
Skrevet

Jeg vet ikke helt hva som er feil for alt du gjør virker riktig selv om jeg ikke er sikker på om x og y skal være 0, men jeg vet jo ikke.

 

Når du bruker ekstra minne og alt sånn ser bildet du leser bra ut?

Skrevet (endret)

Prøv om Giddion nevner å undersøk hvilke verdier x og y har i det glReadPixels kalles. Sjekk også glGetError for eventuelle feil (både før og etter glReadPixels kalles.)

Endret av hishadow
Skrevet (endret)

Haha, jeg fant ut av det. Det ser ut til at glReadPixels av en eller annen grunn insisterer på å jobbe med en bredde som går opp i 4. Følgende kode fungerer utmerket:

 

int datasize = (width + (width % 4)) * height * 3;  
unsigned char *pixels = new unsigned char[datasize];
glReadPixels (x, y, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels);

I den første linjen utvider jeg altså bredden til nærmeste verdi som går opp i 4. Dette var alt som skulle til. Fatter ikke hvorfor dette ikke står nevnt i dokumentasjonen til glReadPixels!

Endret av alfred97
Skrevet (endret)

Hmmm jeg får ikke dette problemet.....

 

edit:

C#

uint[] arr = new uint[data.Width * data.Height];

fixed(uint *ptr = arr)
 OpenGL.NativeOpenGL.glReadPixels(0, 0, m_ctrl.Size.Width, m_ctrl.Size.Height, OpenGL.NativeOpenGL.GL_BGRA_EXT, OpenGL.NativeOpenGL.GL_UNSIGNED_BYTE, ptr);

Funker fint hos meg....

utrolig mystisk...

Endret av GeirGrusom
Skrevet
Hmmm jeg får ikke dette problemet.....

 

edit:

C#

uint[] arr = new uint[data.Width * data.Height];

fixed(uint *ptr = arr)
 OpenGL.NativeOpenGL.glReadPixels(0, 0, m_ctrl.Size.Width, m_ctrl.Size.Height, OpenGL.NativeOpenGL.GL_BGRA_EXT, OpenGL.NativeOpenGL.GL_UNSIGNED_BYTE, ptr);

Funker fint hos meg....

utrolig mystisk...

8818387[/snapback]

 

Det er jo enkelte skjermkort som ikke støtte ikke ^2 størrelse på teksturene. Kan det ha noe med det å gjøre mon tro?

 

ext string "ARB_texture_non_power_of_two"

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...