Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

31.05.2012, 17:43

Und wo sind die Variable definiert? Weshalb ließt du nicht direkt in die Variablen?

Zitat


C-/C++-Quelltext

1
SDL_GetRGBA(p, format, &r, &g, &b, &a);
@D13_Dreinig

12

31.05.2012, 17:57

Die Variablen habe ich am Anfang der Fkt definiert, in welcher ich dieses Gelumpe unter anderem nutzen möchte:

C-/C++-Quelltext

1
Uint8 rc, gc, bc, ac;


Ich schreibe nicht direkt in die Variablen, weil das schlicht nicht geht:

Quellcode

1
Invalid arguments ' Candidates are: void SDL_GetRGBA(unsigned int, const SDL_PixelFormat *, unsigned char *, unsigned char *, unsigned char *, unsigned char *) '


Oder was meinst du jetzt?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

31.05.2012, 19:11

Doch geht:

C-/C++-Quelltext

1
SDL_GetRGBA(p, format, &rc, &gc, &bc, &ac);


Ansonsten könntest du einfach mal ein lauffähiges Beispiel posten, dass das Problem demonstriert?
@D13_Dreinig

14

31.05.2012, 22:36

C-/C++-Quelltext

1
screen = SDL_SetVideoMode(800, 600, [b]16[/b], SDL_HWSURFACE);


Besser:

C-/C++-Quelltext

1
screen = SDL_SetVideoMode(800, 600, [b]24[/b], SDL_HWSURFACE);


Da habe ich Trottel gar nicht drüber nachgedacht! Ich will nen 24Bit Farbwert, aber mein Surface hat nur 16... Das kann ja nicht klappen...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »arnohr« (01.06.2012, 10:02)


15

01.06.2012, 10:37

Da habe ich aber noch eine Frage!

Sollte mir:

C-/C++-Quelltext

1
2
Uint32 ausgabe = SDL_MapRGBA(s->format, rc, gc, bc, ac);
cout << "Ausgabe: " << hex << ausgabe << endl;


Nicht Ausgabe der Form ff0000ff für volles rot bekommen?
Die Ausgabe die ich bekomme lautet aber: ff0000 für rot...

Wobei mir

C-/C++-Quelltext

1
SDL_GetRGBA(p, format, &rc, &gc, &bc, &ac);

Mir für Alpha( == ac) noch nen dezimalen Wert von 255 liefert.

Das Surface habe ich dann auch mit nem 32Bit Farbraum angelegt, aber bei der Ausgabe des SDL_MapRGBA Ergebnisses fehlt irgendwie das letzte Octet für Alpha.

C-/C++-Quelltext

1
screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);

Irgendwas scheine ich nicht zu beachten...

Muss jetzt gerade noch was Anderes machen, werde dann aber nen Demoprogramm schreiben, anhand dessen wir das mal durchspielen können.

16

01.06.2012, 14:57

So, wie gewünscht, habe ich ein kleines Demoprogramm geschrieben, das mein Problem veranschaulicht.

Ausgabe:
Referenzfarbe: ff0000ff

Ausgelesene einzelne 8-Bit Kanäle:
r: 255 g: 0 b: 0 alpha: 255

Ausgelesene Farbe: ff0000


Wie man sieht, geht mir irgendwie der Alpha-Kanal verloren.
Relevant dürfte da die Fkt. getcolor sein. Zeile 65 bis 83...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <SDL/SDL_image.h>
#include <SDL/SDL.h>
#include <SDL/SDL_gfxPrimitives.h>

using namespace std;

Uint32 getpixel(SDL_Surface *surface, int x, int y);
Uint32 getcolor(SDL_Surface *surface, int x, int y);

int main(void) {
    SDL_Surface *screen;
    SDL_Event event;
    Uint32 farbe = 0xff0000ff;

    int x, y;
    bool quit = false;

    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        cout << "Konnte SDL nicht initialisieren: %s\n" << SDL_GetError();
        return EXIT_FAILURE;
    }
    
    atexit(SDL_Quit);

    screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);
    if (screen == NULL) {
        cout << "Videomodus konnte nicht eingerichet werden: " << SDL_GetError()
                << endl;
        return EXIT_FAILURE;
    }

    x = (screen->w / 2);
    y = (screen->h / 2);

    boxRGBA(screen, 0, 0, 800, 600, 255, 255, 255, 255);
    SDL_WM_SetCaption("SDL_MapRGBA Test", 0);
    filledCircleColor(screen, x, y, 250, farbe);
    SDL_UpdateRect(screen, 0, 0, 0, 0);

    cout << "Referenzfarbe: " << hex << farbe << endl;
    cout << "Ausgelesene Farbe: " << hex << getcolor(screen, x, y) << endl;

    while (!quit) {
        if (SDL_WaitEvent(&event) && !quit) {
            switch (event.type) {
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym) {
                case SDLK_ESCAPE:
                    quit = 1;
                    break;
                default:
                    break;
                }
                break;
            }
        }
    }
    return EXIT_SUCCESS;
}

Uint32 getcolor(SDL_Surface *surface, int x, int y) {
    Uint8 r, g, b, a;
    SDL_LockSurface(surface);
    SDL_PixelFormat *format = surface->format;
    Uint32 p = getpixel(surface, x, y);

    SDL_GetRGBA(p, format, &r, &g, &b, &a);
    SDL_UnlockSurface(surface);

    cout << endl;
    cout << "Ausgelesene einzelne 8-Bit Kanäle:" << endl;
    cout << "r: " << dec << (int) r << " g: " << (int) g << " b: " << (int) b
            << " alpha: " << (int) a << endl;
    cout << endl;

    Uint32 result = SDL_MapRGBA(surface->format, r, g, b, a);

    return result;
}

Uint32 getpixel(SDL_Surface *surface, int x, int y) {
    int bpp = surface->format->BytesPerPixel;
    /* Here p is the address to the pixel we want to retrieve */
    Uint8 *p = (Uint8 *) surface->pixels + y * surface->pitch + x * bpp;

    switch (bpp) {
    case 1:
        return *p;
        break;

    case 2:
        return *(Uint16 *) p;
        break;

    case 3:
        if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
        else
            return p[0] | p[1] << 8 | p[2] << 16;
        break;

    case 4:
        return *(Uint32 *) p;
        break;

    default:
        return 0; /* shouldn't happen, but avoids warnings */
    }
}

17

01.06.2012, 14:59

Wenn du alle Werte rgba hast, Mach es halt so..
printf("%02x%02x%02x%02x", r,g,b,a);

18

01.06.2012, 15:10

Das nutzt mir nix...

Ich will das Ergebnis von getcolor() vergleichen und eigentlich gar nicht ausgeben. Ich hatte schon dran gedacht, mit sprintf() mir nen String zu bauen und damit zu arbeiten. Aber das ist voll in die Hose gegangen. Da die anderen Farben in diesem "Uint32" vorliegen.

19

01.06.2012, 15:34

Bahnhof? In welchem Format liegen die anderen Farben vor, als integer?

20

04.06.2012, 14:12

Ja, als Integer. Ich müsste dann erst aus den dezimalen Integern einen Hex-Char bauen und das dann mit sprintf in umgekehrte Reihenfolge auslesen und auf meiner Variablen speichern.
Die Vorgehensweise finde ich irgendwie Dackelkacke.

Dafür gibt es ja SDL_MapRGBA, wäre nur fett wenn ich das korrekt ans laufen bekommen würde und ich nicht dafür das Rad neu erfinden muss.

In der Beschreibung von SDL_MapRGBA habe ich folgendes entdeckt:

Quellcode

1
If the specified pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette). 

In der Beschreibung von SDL_MapRGBA (http://sdl.beuc.net/sdl.wiki/SDL_MapRGBA) habe ich folgendes entdeckt:

Zitat

If the specified pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).


Aber wie könnte das sein? Ich nutze den Alpha-Kanal doch (siehe Zeile 38) :

C-/C++-Quelltext

1
boxRGBA(screen, 0, 0, 800, 600, 255, 255, 255, ALPHA);

und je nachdem wie ich ALPHA setze (0-255), wird der Fensterinhalt mehr oder weniger Transparent.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »arnohr« (04.06.2012, 16:14)


Werbeanzeige