21. december 2005 - 20:03Der er
10 kommentarer og 1 løsning
Farv pixel i SDL Funktionsforståelse
Hejsa
Jeg har en funktion til at male en pixel i SDL. SOm sådan giver det meste mening, men der er lige at par steder, hvor den er helt uforståelig for mig. Stederne er markeret med et nr i en parentes eks (1). Spørgsmålene til de pågældende steder står nedunder.
void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B) { Uint32 color = SDL_MapRGB(screen->format, R, G, B); // (1) switch (screen->format->BytesPerPixel) { case 1: // Assuming 8-bpp { Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y*screen->pitch + x; // (2) *bufp = color; } break; case 2: // Probably 15-bpp or 16-bpp { Uint16 *bufp; bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x; *bufp = color; } break; case 3: // Slow 24-bpp mode, usually not used { Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3; if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { bufp[0] = color; bufp[1] = color >> 8; bufp[2] = color >> 16; } else { bufp[2] = color; bufp[1] = color >> 8; bufp[0] = color >> 16; } } break; case 4: // Probably 32-bpp { Uint32 *bufp; bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x; *bufp = color; } break; } }
Det skal bare forklares kort of overfladisk. Jeg har endnu ikke den helt store forståelse af grafik så alt for meget information vil bare forvirre mig yderligere.
(1) Hvad skal format bruges til? Kan godt se at funktionen giver variablen de nødvendige data til den pågælende farve, men hvad skal den bruge format fra screen (en struktur) til?
(2) Hvordan kan det regnestykke lige blive noget brugbart data? (Uint8 *)screen->pixels + y*screen->pitch + x ??
1: Hvis skærmen har et begrænset antal farver (f.ex. sat til 256 farver) skal SDL_MapRGB bruge denne information og bruge "skærmen" til at mappe til den farve der passer bedst til netop denne skærm (f.ex. hvis der bruges palette).
2: Hvis skærmen er definert som Screen[MAX_Y][MAX_X] er det logisk at sætte: Screen[y][x] = Color (right?) Men nu er skærmen tilsyneladende defineret som Screen[MAX_Y*MAX_X] (eller uint8 *), screen->pitch er så vidt jeg kan regne ud det samme som MAX_X (width), så man får den rigtige pixel med screen + y*MAX_X + x
1) R, G, B er hvert 8 pixel og kan altså beskrive en farve i 24bits dybde. Hvis der fx kun anvendes 8/16 bit (screen->format->BytesPerPixel), skal farven "oversættes", det gøres v.h.a. en palette. Funktionen ta'r SDL_PixelFormat som parameter fordi denne kan indeholde en palette som så bruges.
2) screen->pixels er en pointer til et array hvor pixels ligger. For at finde den pixel der skal ændres, bruges denne pointer som udgangspunkt, hvortil der lægges et antal pixels, svarende til y-koordinatet*pixels_i_bredden (screen->pitch) samt x-koordinatet.
Aha, det klarede en del. Har lige en sidste ting så har jeg styr på det jeg ville. Hvorfor deler man screen->pitch med henholdsvis 2 og 4 ved 16 og 32 bit.
Kan tænke mig frem til at det har noget at gøre med at 1 byte = 8 bit = 16/2 bit = 32/4 bit, men jeg kan ikke lige se sammenhængen.
hvis dybden er 8 bit fylder fx 10 pixel 10 byte. Er den 24 bit fylder de 30 byte. Derfor skal man bruge farvedybden til at regne ud hvor mange bytes man skal frem i pixel-arrayet for at finde den korrekte pixel.
ok, så tror jeg jeg har styr på det hele nu. Mange tak for hjælpen jpk
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.