alfred97 Skrevet 6. juni 2007 Skrevet 6. juni 2007 (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 6. juni 2007 av alfred97
Giddion Skrevet 7. juni 2007 Skrevet 7. juni 2007 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?
GeirGrusom Skrevet 7. juni 2007 Skrevet 7. juni 2007 kanskje (w+1)*(h+1)*d? Lag en BMP fil ut av det (e.l.) og se hva output blir.
hishadow Skrevet 7. juni 2007 Skrevet 7. juni 2007 (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 7. juni 2007 av hishadow
alfred97 Skrevet 8. juni 2007 Forfatter Skrevet 8. juni 2007 (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 8. juni 2007 av alfred97
GeirGrusom Skrevet 9. juni 2007 Skrevet 9. juni 2007 (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 9. juni 2007 av GeirGrusom
Giddion Skrevet 9. juni 2007 Skrevet 9. juni 2007 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"
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å