znora Skrevet 9. februar 2007 Del Skrevet 9. februar 2007 Sorry at jeg ikke kunne finne en bedre tittel. Ok. her er dealen. jeg har en bunsj 3D programmer som bruker SDL og openGL, og noen programmer som bruker SDL og gjør bildemanipulasjon. Da hadde det vært kult å kombinere disse to slik at jeg kan eksempelvis legge en blur eller fargefordreining oppå 3D bildet. Dessverre klarer jeg ikke å lese skjerbildet med SDL_Surface etter vinduet er opprettet og openGL har kontrollen. Hadde jeg vært proff, ville jeg gjordt det samme med shadere, men enn så lenge vil jeg bare ha det gamle til å funke. help anyone? er er et eksempel på hva et filter. Vanligvis loader jeg bildet mitt rett på en SDL_Surface, Setter den til vindusinnholdet (SDL_SetVideoMode), og begynner og jalle. //header.h typedef struct { unsigned char b, g, r, a; } pixel; #include "header.h" //sett oppe en bildeflate. vis den på skjerm. void blur(SDL_Surface *surface, unsigned int filter[], int inx, int iny) { int edgex = (int)inx/2; //Jeg feiger ut og unngå kantprolemet int edgey = (int)iny/2; //Ved å ikke behandle kantene. pixel * pixels = (pixel*) surface->pixels; int x, y, fx, fy; int bredde = (surface->w);// bilde bredden for(x = edgex; x < bredde - edgex; x++){ for(y = edgey; y < brede - edgey; y++){ //Her lagrer jeg pixeldata unsigned int tmpr = 0; //rød unsigned int tmpg = 0; //grønn unsigned int tmpb = 0; //blå for(fy = 0; fy < iny; fy++){ for(fx = 0; fx < inx; fx++){ tmpr += filter[fx + fy*inx]*pixels[x+fx-edgex + (y+fy-edgey)*bredde].r; tmpg += filter[fx + fy*inx]*pixels[x+fx-edgex + (y+fy-edgey)*bredde].g; tmpb += filter[fx + fy*inx]*pixels[x+fx-edgex + (y+fy-edgey)*bredde].b; } } //setter pixeldataen til "gjennomsnittet av de hosliggende pixler. pixels[x + y*bredde].r = tmpr/(inx*iny); pixels[x + y*bredde].g = tmpg/(inx*iny); pixels[x + y*bredde].b = tmpb/(inx*iny); } } } Lenke til kommentar
Giddion Skrevet 9. februar 2007 Del Skrevet 9. februar 2007 Jeg har aldri rota med SDL, men for å lese frambufferen i ogl kan du bruke void glReadPixels(GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type, GLvoid *pixels); Lenke til kommentar
znora Skrevet 10. februar 2007 Forfatter Del Skrevet 10. februar 2007 flotters. burde være en smal sak å konvertere dette til å lese fra framebuffer. Lenke til kommentar
znora Skrevet 11. februar 2007 Forfatter Del Skrevet 11. februar 2007 Kan jeg manipulere framebufferet og putte det tilbake igjen slik at den vises på skjerm? Lenke til kommentar
Giddion Skrevet 11. februar 2007 Del Skrevet 11. februar 2007 glBitmap putter frambufferen direkt tilbake, men den er treg og utdatert så til de grader. Den beste løsningen er vel å bruke bufferen som en tekstur på en heldekende plate. NeHe hadde en bra kode som lignet ditt problem, men GameDev er for tiden nede så jeg har ingen link Lenke til kommentar
_vamecum Skrevet 4. mars 2007 Del Skrevet 4. mars 2007 beste måten å gjøre dette på er nok... gitt at du har en klasse som klarer å rendre til texture.. startRtt(texId); drawScene(); stopRtt(); glBindTexture(texId); enableShader(minHackShader); drawFullScreen2dQuad(); disableShaders(); tegning til tekstur vil fylle opp en gl-tekstur med data fra framebuffer. Det finnes mye god informasjon om dette på nett. bare søk på Frame Buffer Object 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å