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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

01.10.2008, 21:37

[erledigt]blending problem mit alpha

hi hab ein problem mit den alphakanal
http://www.file-upload.net/view-1151525/Unbenannt1.PNG.html

Quellcode

1
2
3
4
5
6
7
8
ilInit();
iluInit();
ilutRenderer(ILUT_OPENGL);

glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glDepthMask(TRUE);
glEnable(GL_TEXTURE_2D);

wenn ich das blending und den alphatest weglasse
sehen die angezeigten grafiken noch normal aus
1.grafik: geladene datei,das blaue rechteck und das rote sind mit ilblit() hinzugefügt worden
2. grafik geladen grafik(blaues rechteck)
3. leere grafik (pixel manuel gesetzt farb(0,0,0,0)) blaues und rotes rechteck sind hinzugefügt worden(ilblt)

http://www.file-upload.net/view-1151541/Unbenannt2.PNG.html
wenn ich jetzt das blending und den alphatest hinzufüge

Quellcode

1
2
3
4
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glAlphaFunc(GL_GREATER ,0.1f);

kommt das dabei raus
1.grafik: das rote rechteck is nicht kommplett
(komm warscheinlich daher das der hintergrund tranzperent is und es mir ilblit hinzugefügt wurde)
2. da is noch ein weißer rand der nicht tranzperent ist
3. da es eine leere grafik war(alles tranzperent) und die grafiken mit ilblit hinzugefügt wurde ist jetzt da von nichts mehr zu sehen

wenn es noch hilft so hab ich die texturen erstellt

Quellcode

1
2
3
4
5
6
7
8
ilBindImage(image_id);
glBindTexture(GL_TEXTURE_2D, texture_id);

glTexImage2D(GL_TEXTURE_2D,0,4,this->width,this->height,0,GL_RGBA,GL_UNSIGNED_BYTE,ilGetData());
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP);

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

01.10.2008, 23:31

Sieht doch alles korrekt aus...
@D13_Dreinig

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

3

01.10.2008, 23:44

leider nicht wenn man sich das 1. und 2. bild anschaut(siehe links)

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

4

02.10.2008, 09:14

Was ist wenn du

Quellcode

1
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);


nimmst?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

02.10.2008, 09:44

Zitat von »"kiba"«

leider nicht wenn man sich das 1. und 2. bild anschaut(siehe links)


Hab ich, und ich finde die Bilder sehen nach einem richtigen Verhalten aus:

1. Die geblitteten Pixel ändern eben nichts an dem Alphawerten und werden deshalb nicht gezeichnet.
2. Ich seh keinen weißen Rand. Und falls da ein weißer Rand wäre müsstest du einfach mal die entsprechenden Alphawerte betrachten.
3. genau wie bei 1.

Im Grund hast du das doch alles bereits richtig erkannt.
@D13_Dreinig

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

6

02.10.2008, 12:24

@Powerpaule
das macht die sache nur noch schlimmer da kommt eine dicker fetter weißer rand


gibt es vll eine anderen funktion womit ich von bild zu bild kopieren kannst
und damit den alpha wert ändern

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

02.10.2008, 13:27

Vielleicht reicht es ja schon wenn dein Pixelpuffer, der kopiert wird, ARGB8 als Pixelformat verwendet (und natürlich entsprechende Alphawerte hat).
@D13_Dreinig

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

8

04.10.2008, 15:54

ich weiß jetzt nicht so genau wie ich die funktion erstellen soll
es soll einfach die pixel setzen von der src_pixel zu den dst_pixel
und dabei soll dann auch der alpha wert gesetzt werden
eben eine blt funktion mit alpha setzung
auser die pixel dessen alpha wert 255 ist werden nicht gesetzt

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

04.10.2008, 19:03

Vermutlich macht das ilblit automatisch, falls Alphawerte im Quellpuffer verfügbar sind.
@D13_Dreinig

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

10

06.10.2008, 15:20

ich hab es geschafft
hab in der lesson 29 von nehe ein funktion gefunden
ich müsste nur noch verändern das er den alpha wert überprüft

Quellcode

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
blt_image(int src_image, int dst_image, int src_xstart, int src_ystart, uint width, uint height,
           int dst_xstart, int dst_ystart, bool blend, uint8 alpha)
{
    uint i,j,k;
    ubyte *src, *dst;                                       // Source & Destination
    
    ilBindImage(dst_image);
    ubyte* dst_data = ilGetData();;
    uint dst_width = ilGetInteger(IL_IMAGE_WIDTH);
    uint dst_height = ilGetInteger(IL_IMAGE_HEIGHT);
    uint dst_bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);
    
    ilBindImage(src_image);
    ubyte* src_data = ilGetData();;
    uint src_width = ilGetInteger(IL_IMAGE_WIDTH);
    uint src_height = ilGetInteger(IL_IMAGE_HEIGHT);
    uint src_bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);


    dst = dst_data + (dst_ystart * dst_width * dst_bpp);    // Start Row - dst (Row * Width In Pixels * Bytes Per Pixel)
    src = src_data + (src_ystart * src_width * src_bpp);    // Start Row - src (Row * Width In Pixels * Bytes Per Pixel)

    for (i = 0 ; i < height ; i++ ){                            // Height Loop
        src = src + (src_xstart * src_bpp);                     // Move Through Src Data By Bytes Per Pixel
        dst = dst + (dst_xstart * dst_bpp);                     // Move Through Dst Data By Bytes Per Pixel
        for (j = 0 ; j < width ; j++ ){                     // Width Loop
            for( k = 0 ; k < src_bpp ; k++, dst++, src++){      // "n" Bytes At A Time
                if (src_bpp == 4){                              // if RGBA
                    if (*(src+src_bpp-1-k) > 0){                //if alpha > 0
                        if (blend)                                      // If Blending Is On
                            *dst = ( (*src * alpha) + (*dst * (255-alpha)) ) >> 8; // Multiply Src Data*alpha Add Dst Data*(255-alpha)
                        else                                            // Keep in 0-255 Range With >> 8
                            *dst = *src;                                    // No Blending Just Do A Straight Copy
                    }
                }else if(src_bpp == 3){                             //if RGB
                    if (blend)                                      // If Blending Is On
                        *dst = ( (*src * alpha) + (*dst * (255-alpha)) ) >> 8; // Multiply Src Data*alpha Add Dst Data*(255-alpha)
                    else                                            // Keep in 0-255 Range With >> 8
                        *dst = *src;
                }
            }
        }
        dst = dst + (dst_width - (width + dst_xstart))*dst_bpp; // Add End Of Row */
        src = src + (src_width - (width + src_xstart))*src_bpp; // Add End Of Row */
    }
}

Werbeanzeige